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


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

在对象中添加一个引用计数器,如果被引用计数器加 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没有引用链的时则该对象不可达,该对象可以被回收。

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