【知识点】垃圾回收之引用计数之循环引用

来源:互联网 发布:工业软件系统 编辑:程序博客网 时间:2024/05/29 15:20

原文地址:http://thatmonkey.blog.51cto.com/7935609/1384463

    引用计数常用来说明垃圾收集的工作方式,但似乎从未被应用与任何一种Java虚拟机中实现。《java编程思想》

关于引用计数法,我们可以先看一段wiki上的描述:

As a collection algorithm, reference counting tracks, for each object, a count of the number of references to it held by other objects. If an object’s reference count reaches zero, the object has become inaccessible, and can be destroyed.

When an object is destroyed, any objects referenced by that object also have their reference counts decreased.

作为一种回收算法,引用计数法记录着每一个对象被其它对象所持有的引用数。如果一个对象的引用计数为零,那么该对象就变成了所谓的不可达对象,亦即可以被回收的。

当一个对象被回收后,被该对象所引用的其它对象的引用计数都应该相应减少。

而所谓的循环引用(circular referrence)有是什么意思呢?举个简单的例子:

public class MyObject {    public Object ref = null;    public static void main(String[] args) {        MyObject myObject1 = new MyObject();        MyObject myObject2 = new MyObject();        myObject1.ref = myObject2;        myObject2.ref = myObject1;        myObject1 = null;        myObject2 = null;    }}

从上面的代码可以轻易地发现myObject1与myObject2互为引用,我们知道如果采用引用计数法,myObject1和myObject2将不能被回收,因为他们的引用计数无法为零。

循环引用图示

但是具体是为什么呢?已上图为例,当代码执行完line7时,两个对象的引用计数均为2。此时将myObject1和myObject2分别置为null,以前一个对象为例,它的引用计数将减1。若要满足垃圾回收的条件,需要清除myObject2中的ref这个引用,而要清除掉这个引用的前提条件是myObject2引用的对象被回收,可是该对象的引用计数也为1,因为myObject1.ref指向了它。以此类推,也就进入一种死循环的状态。

1 1
原创粉丝点击