Java 对象的生命周期
Java 对象的生命周期
类的创建阶段的详细流程
-
第一步:找到需要加载的类并把类的信息加载到jvm的方法区中。加载的方式有如下:
-
从class文件中读取
-
从jar文件中读取
-
从网络获取applet
-
根据一定的规则生成:比如动态代理模式,自动生成的代码
-
从非class文件中读取:道理和从class文件中读取一个道理
加载的时机分为 预加载和延迟加载两种,hotspot就是延迟加载
-
-
第二步:链接 一般与加载过程交叉进行,可细分为三个步骤
-
验证:验证加载的类时候合法
-
准备:为静态变量分配内存,并设置为JVM初始值(非代码设置初始值)。常量设置为代码设置的默认值
-
解析:jvm会将所有的类或接口名、字段名、方法名转换为具体的内存地址
连接阶段完成之后会根据使用的情况(直接引用还是被动引用)来选择是否对类进行初始化
-
-
第三步:如果一个类被直接引用,就会触发类的初始化。以下几种状态称为直接引用
-
通过new关键字实例化对象、读取或设置类的静态变量、调用类的静态方法
-
通过反射方式执行以上三种行为
-
初始化子类的时候会触发父类的初始化
-
作为程序的入口直接运行(main方法)
类的初始化过程是这样的:按照顺序自上而下运行类中的静态变量赋值语句和静态语句,如果有父类,则首先按照顺序运行父类中的静态变量赋值语句和静态语句
数组声明属于被动引用,不会触发初始化
-
对象分为
1.创建阶段(Created)
JVM 加载类的class文件 此时所有的static变量和static代码块将被执行
加载完成后,对局部变量进行赋值(先父后子的顺序)
再执行new方法 调用构造函数
一旦对象被创建,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段
2.应用阶段(In Use)
对象至少被一个强引用持有着
3.不可见阶段(Invisible)
当一个对象处于不可见阶段时,说明程序本身不再持有该对象的任何强引用,虽然该这些引用仍然是存在着的。
简单说就是程序的执行已经超出了该对象的作用域了
4.不可达阶段(Unreachable)
对象处于不可达阶段是指该对象不再被任何强引用所持有。
与“不可见阶段”相比,“不可见阶段”是指程序不再持有该对象的任何强引用,这种情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为”GC root”。存在着这些GC root会导致对象的内存泄露情况,无法被回收
5.收集阶段(Collected)
当垃圾回收器发现该对象已经处于“不可达阶段”并且垃圾回收器已经对该对象的内存空间重新分配做好准备时,则对象进入了“收集阶段”。如果该对象已经重写了finalize()方法,则会去执行该方法的终端操作
6.终结阶段(Finalized)
当对象执行完finalize()方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收
7.对象空间重分配阶段(De-allocated)
垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间重新分配阶段