- public class Main {
- public static void main(String[] args) {
- MyTest test1 = new MyTest();
- MyTest test2 = new MyTest();
- test1.obj = test2;
- test2.obj = test1;//test1与test2存在相互引用
- test1 = null;
- test2 = null;
- System.gc();//回收
- }
- }
- class MyTest{
- public Object obj = null;
- }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- /**
- * 此代码演示了两点:
- * 1.对象可以在被GC时自我拯救。
- * 2.这种自救的机会只有一次,因为一个对象的finalize()方法最多只会被系统自动调用一次
- */
- public class FinalizeEscapeGC {
- public static FinalizeEscapeGC SAVE_HOOK = null;
- public void isAlive() {
- System.out.println("yes, i am still alive :)");
- }
- @Override
- protected void finalize() throws Throwable {
- super.finalize();
- System.out.println("finalize mehtod executed!");
- FinalizeEscapeGC.SAVE_HOOK = this;
- }
- public static void main(String[] args) throws Throwable {
- SAVE_HOOK = new FinalizeEscapeGC();
- //对象第一次成功拯救自己
- SAVE_HOOK = null;
- System.gc();
- //因为finalize方法优先级很低,所以暂停0.5秒以等待它
- Thread.sleep(500);
- if (SAVE_HOOK != null) {
- SAVE_HOOK.isAlive();
- } else {
- System.out.println("no, i am dead :(");
- }
- //下面这段代码与上面的完全相同,但是这次自救却失败了
- SAVE_HOOK = null;
- System.gc();
- //因为finalize方法优先级很低,所以暂停0.5秒以等待它
- Thread.sleep(500);
- if (SAVE_HOOK != null) {
- SAVE_HOOK.isAlive();
- } else {
- System.out.println("no, i am dead :(");
- }
- }
- }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- finalize mehtod executed!
- yes, i am still alive :)
- no, i am dead :(
- 1
- 2
- 3
来源: http://blog.csdn.net/u012369373/article/details/78671846