美文网首页
JVM那些事儿-如何判断对象是否为垃圾(四)

JVM那些事儿-如何判断对象是否为垃圾(四)

作者: 久伴我还是酒伴我 | 来源:发表于2022-03-26 17:56 被阅读0次

简介

判断垃圾对象算法
我们通过两张图片看下是否是垃圾对象


可回收垃圾对象 非垃圾对象

判断是否为垃圾对象可通过两种计算方法:

引用计数法

image.png

在对象中添加一个引用计数器,如果被引用计数器加 1,引用失效时计数器减 1,如果计数器为 0 则被标记为垃圾。

缺点:存在对象间循环引用(ABA)的问题,导致计数器无法清零。目前在Java中没有使用,python 、ruby 中有使用

代码实战

A a=new A();
B b=new B();

a.b=b;
b.a=a;

a=null;
b=null;

上面的代码在堆中会有一个A的实例一个B的实例,且计数属性均为1,执行了第3、4两行代码后,两个实例的引用计数均为2,执行了5、6两行代码后两个实例的计数属性均为1,这时a、b均指向了null,但是堆中的两个实例的计数属性的值却不为0,那么这两个实例无法回收,存在内存泄漏的风险。

可达性分析算法GC ROOT

可达性分析法,就是从一些称为引用链(GC ROOTS)的对象作为起点,从这些节点向下搜索,搜索走过的路径称为引用链(reference chain),当一个对象到GC ROOTS没有引用链的时则该对象不可达,该对象可以被回收。

image.png

回收范围:
1、虚拟机栈中的局部变量表中的对象;
2、方法区中常量引用的对象;
3、方法区中类的静态变量引用的对象;
4、本地方法栈中JNI引用的对象;

相关文章

网友评论

      本文标题:JVM那些事儿-如何判断对象是否为垃圾(四)

      本文链接:https://www.haomeiwen.com/subject/dbjsjrtx.html