【知识点】垃圾回收之引用计数之循环引用
来源:互联网 发布:工业软件系统 编辑:程序博客网 时间: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
- 【知识点】垃圾回收之引用计数之循环引用
- JAVA垃圾回收 之 引用计数 之 循环引用
- PHP垃圾回收机制之引用计数
- Java虚拟机 垃圾回收 之 引用计数
- JVM垃圾回收之引用计数法
- java垃圾回收之循环引用
- Python垃圾回收之循环引用
- 引用计数和垃圾回收
- 引用计数与垃圾收集之比较
- java之垃圾回收和引用类型
- java垃圾回收算法之-引用计数器
- jvm垃圾回收机制之可达性算法与引用计数算法
- C++引用计数实现垃圾回收机制
- 垃圾回收机制--引用计数基本知识
- python引用计数和gc垃圾回收
- iOS之引用计数
- cocos2dx之 引用计数
- 垃圾回收器算法之引用计数器法
- java3d 的学习笔记1
- 安装centos需要配置的源。
- 黑盒测试方法—因果图法
- 初学Shiro
- Python 迭代器
- 【知识点】垃圾回收之引用计数之循环引用
- nyoj891找点(区间上的贪心)
- 一个图书售卖网页
- 给VirtualBox上的Ubuntu虚拟机扩展硬盘空间
- PAT 乙级 1007. 素数对猜想 (20)
- 第十周第十一周项目1阅读程序(4)
- 编程之美之买书
- bestcoder 1001 大搬家(排列组合)
- poj1988Cube Stacking(并查集+路径压缩)