JVM (PART V)如何判断对象是否应该回收

来源:互联网 发布:淘宝注册手机验证码 编辑:程序博客网 时间:2024/05/19 01:33

再进行垃圾回收之前必须先判断对象是否还“存活”,如何判断对象是否“存活”?

引用计数法

做法:
给对象添加一个引用计数器,每当有一个地方引用他的时候,计数器加一,当引用失效的时候计数器减一。如果计数器的值为零则表示对象不可能再被使用。

优点:
实现简单,判定效率高

缺点:
无法解决对象间循环引用的问题

对象的循环引用

图解:
这里写图片描述
如果objA和objB都有字段instance并且
objA.instance=objB;
objB.instance=objA;
除此之外再无其他引用。此时引用计数器的值都为2。
如果令objA=null;objB=null;
此时在堆中的对象就会变得“不可到达”,但是他们还彼此持有彼此的引用,结果如图所示:
这里写图片描述
注意此时我们再也无法引用堆中的对象objA,和objB(姑且这么叫),但是引用计数器的值都是1。
于是乎在对象的引用计数法中会判断这两个对象依然存活。
如果存在大量这样的彼此引用的对象就会导致内存泄漏。

可达性分析算法

做法:
通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链的时候,这个对象就是可以被回收的。
图解:
这里写图片描述
可以作为GC Roots的对象包括:

1.虚拟机栈(栈内存)中的引用对象2.方法区中的静态属性引用的对象3.方法区中的常量引用对象4.本地方法栈中JNI引用的对象
原创粉丝点击