您好,欢迎来到百家汽车网。
搜索
您的当前位置:首页Java对象的生命周期

Java对象的生命周期

来源:百家汽车网
Java对象的⽣命周期对象的⽣命周期

在Java中,对象的⽣命周期包含下⾯⼏个阶段:1. 创建阶段(Created)2. 应⽤阶段(In Use)3. 不可见阶段(Invisible)4. 不可达阶段(Unreachable)5. 收集阶段(Collected)6. 终结阶段(Finalized)

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

图1. JavaObject Life Cycle

1.创建阶段(Created)

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

l 为对象分配存储空间l 開始构造对象

l 从超类到⼦类对static成员进⾏初始化

l 超类成员变量按顺序初始化,递归调⽤超类的构造⽅法l ⼦类成员变量按顺序初始化,⼦类构造⽅法调⽤

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

2.应⽤阶段(In Use)

对象⾄少被⼀个强引⽤持有着。

3.不可见阶段(Invisible)

当⼀个对象处于不可见阶段时,说明程序本⾝不再持有该对象的不论什么强引⽤,尽管该这些引⽤仍然是存在着的。简单说就是程序的运⾏已经超出了该对象的作⽤域了。

举⽐例如以下图:本地变量count在25⾏时已经超出了其作⽤域,则在此时称之为count处于不可视阶段。当然这样的情况编译器在编译的过程中会直接报错了。

图2. 不可见阶段演⽰样例

4.不可达阶段(Unreachable)

对象处于不可达阶段是指该对象不再被不论什么强引⽤所持有。

与“不可见阶段”相⽐,“不可见阶段”是指程序不再持有该对象的不论什么强引⽤,这样的情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引⽤持有着,这些特殊的强引⽤被称为”GC root”。存在着这些GC root会导致对象的内存泄露情况,⽆法被回收。

5.收集阶段(Collected)

当垃圾回收器发现该对象已经处于“不可达阶段”⽽且垃圾回收器已经对该对象的内存空间⼜⼀次分配做好准备时,则对象进⼊了“收集阶段”。

假设该对象已经重写了finalize()⽅法,则会去运⾏该⽅法的终端操作。这⾥要特别说明⼀下:不要重载finazlie()⽅法!原因有两点:

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

在分配该对象时,JVM须要在垃圾回收器上注冊该对象,以便在回收时可以运⾏该重载⽅法;在该⽅法的运⾏时须要消耗CPU时间且在运⾏完该⽅法后才会⼜⼀次运⾏回收操作,即⾄少须要垃圾回收器对该对象运⾏两次GC。

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

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

6.终结阶段

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

7.对象空间⼜⼀次分配阶段

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务