Java对象的周期

669 阅读3分钟

引自原文作者:Sodino

纯做学习用途

Java对象的生命周期

在java中,对象的生命周期包括以下几个阶段:

1. 创建阶段(Created)
2. 应用阶段(In Use)
3. 不可见阶段(Invisible)
4. 不可达阶段(Unreachable)
5. 收集阶段(Collected)
6. 终结阶段(Finalized)
7. 对象空间重新分配阶段(De-allocated)

1.创建阶段(Created)

  • 在创建阶段通过以下几个步骤来完成对象的创建过程:
    1)为对象分配储存空间
    2)开始构造对象
    3)从超类到子类对static成员进行初始化
    4)超类成员变量按顺序初始化,递归调用超类的构造方法
    5)子类成员变量按顺序初始化,子类构造方法调用
    PS:一但对象被创建并分配给某些变量赋值,这个对象的状态就切换到了应用阶段

2.应用阶段(In Use)

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

3.不可见阶段(Invisible)

当一个对象处于不可见阶段时,说明程序不再持有该对象的任何强引用,虽然这些引用任然是存在着。也就是程序的执行超过该对象的作用域了。 小demo:

    
    

4.不可达阶段(Unreachable)

对象不可达阶段是指该对象不再被任何强引用所持有。
对比:与不可见阶段相比,不可见阶段是指程序不在持有该对象的任何强引用。这种情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被成为‘GC Root’。
    存在'GC root'会导致对象的内存泄漏情况,无法被回收

5.收集阶段(Collected)

  • 当垃圾回收器发现该对象已经处于不可达阶段并且垃圾回收器已经对该对象的内存空间重新分配做好准备时,该对象进入收集阶段。
  • 如果该对象已经重写了 finazlie()方法,则会去执行该方法的终端操作。
  • PS:不要去重载finazlie()方法!

①因为会影响JVM的对象分配与回收速度

在分配该对象时,JVM需要在垃圾回收器上注册该对象,以便在回收时能够执行该重载方法。
在该方法的执行时需要销毁CPU的时间,并且在执行完该方法之后再重新执行回收操作,即至少需要垃圾回收器对该对象执行两次GC。

②可能造成该对象的再次复活

在finazlie()方法中,如果有其他强引用再次持有该对象,则会导致对象的状态由收集阶段改变为应用阶段。这个已经破坏了java生命周期进程,并且复活的对象不利于后续的代码管理。

6.终结阶段(Finalized)

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

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

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