您的位置:首页 > 其它

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

2017-10-01 13:49 337 查看
再进行垃圾回收之前必须先判断对象是否还“存活”,如何判断对象是否“存活”?

引用计数法

做法:

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

优点:

实现简单,判定效率高

缺点:

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

对象的循环引用

图解:



如果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引用的对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jvm 对象 instance