Java 中对象的生命周期

2019-03-05  本文已影响0人  Eren丶耶格尔
Java 对象生命周期

1. 创建阶段(Created)

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

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

2. 应用阶段(In Use)

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

3.不可见阶段(Invisible)

当一个对象处于不可见阶段时,说明程序本身不再持有该对象的任何强引用,虽然该这些引用仍然是存在着的。简单说就是程序的执行已经超出了该对象的作用域了。举例如下代码:本地变量 count 在打印时已经超出了其作用域,则在此时称之为 count 处于不可见阶段。当然这种情况编译器在编译的过程中会直接报错了。

    boolean has = false;
    while (has) {
        int count = 0;
        count ++;
    }
    
    //1
    System.out.println(count);

4. 不可达阶段(Unreachable)

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

5. 收集阶段(Collected)

当垃圾回收器发现该对象已经处于 “不可达阶段” 并且垃圾回收器已经对该对象的内存空间重新分配做好准备时,则对象进入了 “收集阶段”。如果该对象已经重写了 finalize() 方法,则会去执行该方法的终端操作。这里要特别说明一下:不要重载 finazlie() 方法!原因有两点:

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

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

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

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

6. 终结阶段(Finalized)

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

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

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

上一篇下一篇

猜你喜欢

热点阅读