http://blog.csdn.net/dc_726/article/details/7934101
附:对象复活
在根搜索中得到的不可达对象并不是立即就被标记成可回收的,而是先进行一次
标记放入F-Queue等待执行对象的finalize()方法,执行后GC将进行二次标记,复活
的对象之后将不会被回收。因此,使对象复活的唯一办法就是重写finalize()方法,
并使对象重新被引用。
- package com.cdai.jvm.gc;
-
- public class DeadToRebirth {
-
- private static DeadToRebirth hook;
-
- @Override
- public void finalize() throws Throwable {
- super.finalize();
- DeadToRebirth.hook = this;
- }
-
- public static void main(String[] args) throws Exception {
- DeadToRebirth.hook = new DeadToRebirth();
- DeadToRebirth.hook = null;
- System.gc();
- Thread.sleep(500);
- if (DeadToRebirth.hook != null)
- System.out.println("Rebirth!");
- else
- System.out.println("Dead!");
-
- DeadToRebirth.hook = null;
- System.gc();
- Thread.sleep(500);
- if (DeadToRebirth.hook != null)
- System.out.println("Rebirth!");
- else
- System.out.println("Dead!");
- }
-
- }
要注意的两点是:
第一,finalize()方法只会被执行一次,所以对象只有一次复活的机会。
第二,执行GC后,要停顿半秒等待优先级很低的finalize()执行完毕。