java对象生命周期
对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free)。
创建阶段
一个Java类(除Object类外)至少有一个父类(Object),这个规则既是强制的,也是隐式的。你可能已经注意到在创建一个Java类的时候,并没有显式地声明扩展(extends)一个Object父类。
创建对象时应该遵循的规则
避免在循环体中创建对象,即使该对象占用内存空间不大。
不要对一个对象进行多次初始化,这同样会带来较大的内存开销,降低系统性能。
应用阶段
不可视阶段
如果一个对象已经用完,而且在其可视区域不在使用,此时应该主动将其设置为空(null),方便jvm回收垃圾对象。
不可到达阶段
在虚拟机所管理的对象引用根集合中再也找不到直接或间接的强引用,这些对象通常是指所有线程栈中的临时变量,所有已装载的类的静态变量或者对本地代码接口(JNI)的引用。这些对象都是要被垃圾回收器回收的预备对象,但此时该对象并不能被垃圾回收器直接回收。其实所有垃圾回收算法所面临的问题是相同的——找出由分配器分配的,但是用户程序不可到达的内存块。
可收集阶段、终结阶段与释放阶段
垃圾回收器发现该对象已经不可到达。
finalize方法已经被执行。
对象空间已被重用。
当对象处于上面的三种情况时,该对象就处于可收集阶段、终结阶段与释放阶段了。虚拟机就可以直接将该对象回收了。
java类生命周期
一个java类的完整生命周期会经历加载,连接,初始化,使用,卸载五个阶段。
初始化
如果一个类被直接引用,就会触发类的初始化。java中,直接引用的情况有:
通过new关键字实例化对象,读取或设置类的静态变量,调用类的静态方法。
通过反射方式执行以上三种行为
初始化子类的时候会触发父类的初始化
作为程序入口直接运行时
卸载
类卸载的情况:
该类所有的实例都已经被回收,java堆中不在含有该类的任何实例
加载该类的classloader已经被回收
无法在任何地方通过反射访问该类的方法