大家好,加个餐!
像线程的生命周期,Servlet的生命周期,相信这类问题大家都非常熟悉了
Java对象在内存中的生命周期,这个题目倒是有些新鲜
来,思考片刻,说出你的答案
(PS:上图缓冲)
Java对象在其内存中的生命周期可以被划分为多个阶段,下面钊哥逐个给大家说一说
1,创建阶段(Creation / Created)
(1)当Java程序通过new关键字创建一个对象时,首先会在堆内存中为对象分配足够的存储空间
(2)分配空间后,会调用相应的构造器初始化对象的实例变量
(3)若类中有静态成员变量,它们会在类加载的过程中进行初始化,而非与每个对象实例一起初始化
2,使用阶段(Using / In Use)
(1)对象创建完成后进入应用阶段,在这个阶段对象可以被程序访问和操作
(2)在这个阶段,对象持有至少一个强引用(Strong Reference),因此它是可达的,不会被视为垃圾
3,不可达阶段(Unreachable / Unreachable)
(1)当对象没有任何强引用指向它时,就进入了不可达状态,也就是说从根对象(GC Roots)出发无法通过引用链找到这个对象。
(2)JVM垃圾回收器在进行可达性分析时,会识别并标记这些不可达对象。
4,收集阶段(Collected)
(1)垃圾回收器检测到对象不可达后,会在某个合适的时机回收这些对象占用的内存空间
(2)在大多数垃圾回收器中,这通常意味着对象会被放入待回收集合中,等待下次垃圾回收周期将其清除
5,终结阶段(Finalized)
(1)在某些情况下(尤其是对象即将被垃圾回收前),若对象实现了 finalize() 方法,JVM会在回收对象前调用这个方法,给予对象最后一次自我清理的机会
(2)注意,finalize() 方法并不保证一定会被执行,且不应用于依赖其执行关键清理操作
6,对象空间重分配阶段(De-allocated)
(1)在对象的 finalize() 方法(如果有)执行完毕后,垃圾回收器正式释放对象所占用的内存空间,将其归还给内存池。
(2)当这部分内存重新分配给新的对象时,可能会经过内存碎片整理的过程
今天的分享就到这了,每日提升一点,一起变得更强!