java对象的生命周期
2021-02-10 16:18
标签:应用 water 说明 cte 调用 The 演示 递归调用 成员 在Java中,对象的生命周期包含下面几个阶段: 1. 创建阶段(Created) 2. 应用阶段(In Use) 3. 不可见阶段(Invisible) 4. 不可达阶段(Unreachable) 5. 收集阶段(Collected) 6. 终结阶段(Finalized) 7. 对象空间重分配阶段(De-allocated) 图1. JavaObject Life Cycle 在创建阶段系统通过以下的几个步骤来完毕对象的创建过程 一旦对象被创建,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段 对象至少被一个强引用持有着。 当一个对象处于不可见阶段时,说明程序本身不再持有该对象的不论什么强引用,尽管该这些引用仍然是存在着的。 简单说就是程序的运行已经超出了该对象的作用域了。 举比例如以下图:本地变量count在25行时已经超出了其作用域,则在此时称之为count处于不可视阶段。当然这样的情况编译器在编译的过程中会直接报错了。 对象处于不可达阶段是指该对象不再被不论什么强引用所持有。 与“不可见阶段”相比,“不可见阶段”是指程序不再持有该对象的不论什么强引用,这样的情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为”GC root”。存在着这些GC root会导致对象的内存泄露情况,无法被回收。 当垃圾回收器发现该对象已经处于“不可达阶段”而且垃圾回收器已经对该对象的内存空间又一次分配做好准备时,则对象进入了“收集阶段”。假设该对象已经重写了finalize()方法,则会去运行该方法的终端操作。 这里要特别说明一下:不要重载finazlie()方法!原因有两点: 在分配该对象时,JVM须要在垃圾回收器上注冊该对象,以便在回收时可以运行该重载方法;在该方法的运行时须要消耗CPU时间且在运行完该方法后才会又一次运行回收操作,即至少须要垃圾回收器对该对象运行两次GC。 在finalize()方法中,假设有其他的强引用再次持有该对象,则会导致对象的状态由“收集阶段”又又一次变为“应用阶段”。这个已经破坏了Java对象的生命周期进程,且“复活”的对象不利用兴许的代码管理。 当对象运行完finalize()方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。 垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间又一次分配阶段”。 此文章转载于https://www.cnblogs.com/mengfanrong/p/4007456.html,多谢知识分享 java对象的生命周期 标签:应用 water 说明 cte 调用 The 演示 递归调用 成员 原文地址:https://www.cnblogs.com/hjq347935587/p/12742227.htmlJava对象的生命周期
1.创建阶段(Created)
2.应用阶段(In Use)
3.不可见阶段(Invisible)
图2. 不可见阶段演示样例4.不可达阶段(Unreachable)
5.收集阶段(Collected)
6.终结阶段
7.对象空间又一次分配阶段
上一篇:python正则表达式
下一篇:数组对象循环格式化时间撮的转换