Java对象生命周期和类生命周期

本文详细阐述了Java对象从创建、应用、不可视、不可达、可收集、终结到对象空间重分配的完整生命周期过程,以及类的生命周期阶段,包括加载、连接、初始化和卸载等环节。
摘要由CSDN通过智能技术生成

对象的生命周期

对象的整个生命周期大致可以分为7个阶段:

  • 创建阶段(Creation)

  • 应用阶段(In Use)

  • 不可视阶段(Invisible)

  • 不可达阶段(Unreachable)

  • 可收集阶段(Collected)

  • 终结阶段(Finalized)

  • 对象空间重分配阶段(De-allocated)

创建阶段(Creation)

一个Java类至少有一个父类Object(除了Object类本身),这个规则既是强制的,也是隐式的。你可能已经注意到在创建一个Java类的时候,并没有显式地声明扩展(extends)一个Object父类。

//TempA的声明等同于TempB
public class TempA { } 
public class TempB extends java.lang.Object { } 

在创建阶段系统通过以下的几个步骤来完成对象的创建过程:

  1. 为对象分配存储空间

  2. 开始构造对象

  3. 从超类到子类对static成员进行初始化

  4. 超类成员变量按顺序初始化,递归调用超类的构造方法

  5. 子类成员变量按顺序初始化,子类构造方法调用

一旦对象被创建,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段

应用阶段(Using)

对象至少被一个强引用持有着。

不可视阶段(Invisible)

当一个对象处于不可见阶段时,说明程序本身不再持有该对象的任何强引用,但是这些引用可能还存在着,**一般具体是指程序的执行已经超过该对象的作用域了。

        boolean bool = false;
        if(bool){
            int count =0;
            count++;
        }
        System.out.println(count);

本地变量count在System.out.println(count)时已经超出了其作用域,则在此时称之为count处于不可视阶段。当然这样的情况编译器在编译的过程中会直接报错了。

不可达阶段(Unreachable)

对象处于不可达阶段是指该对象不再被任何强引用所持有,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为”GC root”。存在着这些GC root会导致对象的内存泄露情况,无法被回收。

可收集阶段(Collected)

当垃圾回收器发现该对象已经处于“不可达阶段”而且垃圾回收器已经对该对象的内存空间又一次分配做好准备时,则对象进入了“收集阶段”。假设该对象已经重写了finalize()方法,则会去运行该方法的终端操作。

这里要特别说明一下:不要重载finazlie()方法!原因有两点:

  • 会影响JVM的对象分配与回收速度
    在分配该对象时,JVM须要在垃圾回收器上注冊该对象,以便在回收时可以运行该重载方法;在该方法的运行时须要消耗CPU时间且在运行完该方法后才会又一次运行回收操作,即至少须要垃圾回收器对该对象运行两次GC。

  • 可能造成该对象的再次“复活”
    在finalize()方法中,假设有其他的强引用再次持有该对象,则会导致对象的状态由“收集阶段”又又一次变为“应用阶段”。这个已经破坏了Java对象的生命周期进程,且“复活”的对象不利用兴许的代码管理。

终结阶段(Finalized)

当对象运行完finalize()方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。

对象空间重分配阶段(De-allocated)

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

类的生命周期

一个类完整的生命周期,会经历五个阶段,分别为:加载、连接、初始化、使用卸载。其中的连接又分为验证、准备解析三个步骤。如下图所示:

简单一句话概括,类的加载机制就是:找到需要加载的类并把类的信息加载到jvm的方法区中),然后在堆区中实例化一个java.lang.Class对象,作为方法区中这个类的信息的入口。结合jvm的内存结构会比较好理解。

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值