**要宣布一个对象死亡至少要经历两次标记过程:如果通过可达性分析没有与GC?Roots相连接的引用链,会被第一次标记和进行一次筛选。筛选条件是此 对象是否有执行finalize()方法,当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过。虚拟机将这两种情况都视为“没有必要执行”。
如果一个对象有必要执行finalize()方法,会被放在F-Queue队列,并在稍后一个由虚拟机自己建立的、低优先级的Finalizer线程去执行它,虚拟机会触 发这个方法,但是不会等它执行完,否则如果一个对象在finalize()方法中执行缓慢,那么内存回收系统会崩溃。finalize()方法是对象最后一次逃脱死亡机 会。稍后GC将对F-Queue中的对象进行第二次小规模标记,如果对象在第二次标记前没能拯救自己就要被回收。拯救办法是只要与引用链上任何一个对象建 立关联即可。**
上面的内容来自书籍,如果按照上述,那么当对象的finalize()方法没有必要执行或没有覆盖,那不是只标记一次就可以吗?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…