垃圾回收之引用计数之循环引用
2016-05-09 20:07
417 查看
原文地址:/article/7400047.html
引用计数常用来说明垃圾收集的工作方式,但似乎从未被应用与任何一种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指向了它。以此类推,也就进入一种死循环的状态。
相关文章推荐
- 初学Shiro
- MagicalRecord(简化CoreData操作)
- PAT 乙级 1007. 素数对猜想 (20)
- 一个图书售卖网页
- nyoj 123 士兵杀敌(四)
- Codeforces Round #151 (Div. 2) C. Beauty Pageant
- 给VirtualBox上的Ubuntu虚拟机扩展硬盘空间
- 第十一周【项目1 - 点-圆-圆柱类族的设计2】
- HDU 1850-Being a Good Boy in Spring Festival(Nim博弈)
- PHP数据类型转换
- leetcode 83--Remove Duplicates from Sorted List 链表 删除元素
- 黑盒测试方法—因果图法
- java3d 的学习笔记1
- java线程同步等基础知识
- 【Latex】Latex小白入门(2)——如何用.bib文件自动生成论文Reference
- 第十周第十一周项目1阅读程序(3)
- 安装centos需要配置的源。
- 网站的高性能架构---存储性能优化
- MyBatis学习--SqlMapConfig.xml配置文件
- 解决docker images,info,-d等命令报错的问题