深入理解JVM--如何判断对象是否死亡

概述

堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断那些对象已经死亡(即不能再被任何途径使用的对象)

引用计数法

给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1;当引用失效,计数器就减1;任何时候计数器为0的对象就是不可能再被使用的。

这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的原因是它很难解决对象之间相互循环引用的问题。

例如:objA.instance = objB;及 objB.instance = objA;除此之外两个对象再无其他引用,实际上这两个对象已经不可能再被访问,但是他们因为互相引用着对方,导致他们的引用计数都不为零,于是引用计数算法无法通知GC收集器回收他们

可达性分析算法

在主流的商用程序语言(Java , C# 等)的主流实现中都是使用可达性分析(Reachability Analysis)来判定对象是否是存活的。

这个算法的基本思想就是通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连的话,则证明此对象是不可用的。
深入理解JVM--如何判断对象是否死亡

在Java 语言中,可作为GC Roots的对象包括下面几种:
    a.虚拟机栈(栈帧中的本地变量表)中引用的对象
    b.方法区中类静态属性引用的对象
    c.方法区中常量引用的对象
    d.本地方法栈中JIT(即一般说的Native方法)引用的对象

这里是引用
https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247483914&idx=1&sn=9aa157d4a1570962c39783cdeec7e539&chksm=fd98546bcaefdd7d9f61cd356e5584e56b64e234c3a403ed93cb6d4dde07a505e3000fd0c427#rd
https://www.cnblogs.com/lrh-xl/p/5292495.html

相关文章: