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)

垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间重新分配阶段

转载于:https://juejin.im/post/5b690bbf6fb9a04fae212e2c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值