3.1 判断垃圾可以回收的方法有哪些?如何判断对象是否死亡?

mac2025-08-21  16

如何判断对象是否死亡?判断垃圾可以回收的方法有哪些?

引用计数法(判断对象的引用数量): 它的基本思想是堆中每个对象都有一个引用计数器,每当有一个地方引用它,计数器的值就加1;当引用失效时,计数器的值就减1。计数器值为0的对象可以被当做垃圾回收。优点是实现简单,效率也高。缺点是无法检测出循环引用,比如父对象引用了子对象,子对象反过来又引用父对象,导致它们的引用计数永远不为 0,从而无法被回收。可达性分析算法(判断对象的引用链是否可达): Java语言是通过可达性分析算法来判断对象是否存活的。这个算法的基本思想是以 GC Root 对象为起点,开始往下搜索,所走过的路径称为引用链,当 GC Root 和一个对象之间没有任何引用链相连时,则证明此对象是不可用的。可作为 GC Root 的对象包括四种:虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、以及本地方法中引用的对象。 即使在可达性分析算法中不可达的对象,也并非是“非死不可”,它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记。对象在进行可达性分析后发现没有与 GC Root 相连接的引用链,那它将会被第一次标记;第一次标记后接着会进行一次筛选,筛选的条件是此对象在执行 finalize 方法时能否与引用链建立关联关系,如果没有建立,那么将会被第二次标记,第二次标记成功的对象才会被真的回收;如果与引用链重新建立了关联关系,那么将会逃离本次回收,继续存活。
最新回复(0)