jvm如何判断对象是存活还是已经死亡

蔚落 2021-09-24 16:04 407阅读 0赞

引用计数法:

给对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就+1,;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不可能在被使用。
优点:判定效率很高
缺点:
1、需要单独的字段存储计数器,增加存储空间的开销;
2、计数器每次赋值时,要做加减法操作,增加了时间的开销;
3、无法处理循环引用的问题,比如两个对象相互引用的问题,引用计数永远不可能为0,计算就不准确了,正是因为这个问题,几乎不使用这种方法,如下图,虽然obj1和obj2已经不再被使用了,但是他们的计数器都不为0,

  1. public class MyObj {
  2. public MyObj myObj;
  3. }
  4. public static void main(String[] args) {
  5. MyObj obj1 = new MyObj();
  6. MyObj obj2 = new MyObj();
  7. obj1.myObj = obj2;
  8. obj2.myObj = obj1;
  9. obj1 = null;
  10. obj2 = null;
  11. }

可达性分析算法:

通过一系列的GC Roots的对象作为起始点,从这些根节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,被第一次标记,经过第二次判断,发现真的没有被使用了,才会被回收
优点:除了简单、高效执行之外,还能解决引用计数法中的循环引用的问题,目前较常用
GC Roots对象
1.虚拟机栈(栈帧中本地变量表)中引用的对象,如:各个线程被调用的方法中使用的参数、局部变量等
2.本地方法栈中JNI(Native方法)引用的对象
3.方法区中类静态属性引用的对象
4.方法区中常量引用的对象
5.所有被同步锁synchronized持有的对象
除了以上的几种还有其他的

发表评论

表情:
评论列表 (有 0 条评论,407人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JVM死亡对象判断方法

    堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的对象)。 一、引用计数法 给对象中添加一个引用计数器: 每

    相关 如何判断对象是否存活

    判断对象是否存活的方法主要有两种:引用计数算法,可达性分析算法 引用计数算法 给对象添加一个引用计数器,当有一个地方引用它时,引用计数器+1,当有一个引用失效时,引用计