每一个对象都有两个属性:
1. Reachable可达,Finalizer-Reachable终接器-可达,Unreachable不可达
2. Unfinalized未终结,Finalizable可终结,Finlized已终结
对象可达:对象被任意一个存活线程引用。对程序进行优化设计的一种方法是减少原本可达状态的对象。例如,当编译器或代码生成工具不论明确或隐性声明一个变量或者参数时,变量或参数不再使用NULL去存储一个可能被回收的对象。
终接器-可达:对象可以被处于终结状态的链接或者存在引用,但并不会被任何存活的线程访问到。
不可达:对象不能通过任何方法访问。
未终结:对象未被Finalizer(终接器)自动访问finalize方法
已终结:对象已被Finalizer(终接器)自动访问finalize方法
可终结:对象未被Finalizer(终接器)自动访问,但JVM已经访问finalize方法
对象生命周期转化图
A:对象创建
B C D E F : 一个可达的对象的引用程序执行过程中废弃
G H : 如果JVM发现一个 未终结 对象变为 终接器-可达 或者 不可达
I :JVM发现一个 已终结 对象状态变为 不可达,这时可能发生内存回收导致对象彻底回收
J K : JVM会一直执行某个线程,将任何 可回收对象的 finalize方法调用。对象转变为 已终结 可达状态
L M N : JVM会一直执行某个线程,将任何 可回收对象的 finalize方法调用,此时发生对象自救对象转变为可达状态
O : 如果一个类的对象未覆盖finalize方法,对象突然消失而不是等待之后把对象转变为不可达状态,那么对象的实例会转变为不可达状态。
对象不可能处于 不可达 可终结,由于对象可以被终接器调用终结方法,因此对象必然是可达的,这样终接器线程才能够调用对象的终结方法。因此一个对象只能处于上述八种状态。
一个对象被终结后,在内存自动回收管理器将对象转变为不可达状态前不能再进行对对象进行操作。
当一个未终结对象从可终结状态转变为已终结状态,JVM不会自动调用多次任何对象的finalize方法,即使这个对象再一次变为可达在其变为已终结状态之后。
终接器明确的调用不受当前对象状态的影响,且不会改变对象的终结属性。
程序狗们得注意啦,终接器在启动期间可以自动调用方法,即使对象状态为可达,更进一步来说,终接器也可以自动调用对象的普通方法。因此建议设计对象的finalize方法尽量简单和安全,这样可以使程序的健壮性更好。
原地址:Sun Doc - Implementing Finalization
对象销毁过程demo 对象生命周期状态详解