在java中,对象的生命周期包含以下几个阶段:
1、创建阶段(Created)
2、应用阶段(In Use)
3、不可见阶段(Invisible)
4、不可达阶段(Unreachable)
5、收集阶段(Collected)
6、终结阶段(Finalized)
7、对象空间重分配阶段(De-allocated)
创建阶段
通过以下步骤,完成对象的创建
(1)为对象分配存储空间
(2)开始构造对象
(3)递归调用其超类的构造方法
(4)进行对象实例初始化与变量初始化
(5)执行构造方法体
应用阶段
当对象的创建阶段结束之后,该对象通常就会进入对象的应用阶段。这个阶段是对象得以表现自身能力的阶段。也就是说对象的应用阶段是对象整个生命周期中证明自身存在价值的时期。在对象的应用阶段,对象具备下列特征:
系统至少维护着对象的一个强引用;
所有对该对象的引用全部是强引用(除非我们显示地使用了:软引用、弱引用或虚引用)
不可视阶段
在一个对象经历了应用阶段之后,那么该对象便处于不可视阶段,说明我们在其他区域的代码中已经不可以再引用他,其强引用已经消失,如本地变量超出了其可视范围。
如果一个对象已经使用完,而且在其可视区域不再使用,此时应该主动将其设置为空(null),这样做的意义是可以帮助jvm及时的发现这个垃圾对象,并且可以及时的回收该对象所占用的系统资源。
不可达阶段
对象处于不可达阶段是指该对象不再被任何强引用所持有。
处于不可到达阶段的对象,与不可见阶段相比,不可见阶段是指程序不再持有该对象的任何引用,这种情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为GC ROOT,存在着这些GC root会导致对象的内存泄露,无法被回收。
收集阶段
当垃圾回收器发现该对象已经处于“不可达阶段”并且垃圾回收器已经对该对象的内存空间重新分配做好准备时,则对象进入了“收集阶段”,如果该对象已经重写了finalize()方法,则会去执行该方法的终端操作。
终结阶段
当对象执行完finalize()方法后仍然处于不可达状态,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。
对象空间重新分配阶段
垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间重新分配阶段”
特别说明的是:
1、在对象在创建出来之前,首先需要加载该类。此时,java运行时从硬盘中读取.class文件然后将其读入内存。然后java会虚招任何静态初始器来初始化静态变量——这些变量不属于任何特定的类的实例,而是属于类本身,并由该类创建的所有对象共享。
2、第一次从类创建对象或第一次访问类的静态字段或方法时,会加载一个类。例如,当你运行一个类main方法时,该类将被初始化,因为main方法是静态的。