垃圾回收

来源:互联网 发布:阿里云地域怎么理解 编辑:程序博客网 时间:2024/04/29 02:35

转自:http://www.cnblogs.com/yuyijq/archive/2011/05/28/2060733.html

1:引用计数

引用计数(Reference Counting)

引用计数,顾名思义,就是每个对象上有个计数器,当添加了一个对它的引用时它的计数器就会加1,当不再使用这个引用时它的计数器就会递减1。当计数器为0的时候则认为该对象是垃圾,可以被回收了,如果该对象被回收则该对象所引用的所有对象的计数器会跟着递减。这样有可能会有很多对象的引用都减为0。

使用引用计数做垃圾收集的算法的一个优点是实现很简单,与其他垃圾收集算法相比还有个特点是它的垃圾收集过程不会造成程序暂停(这个后面会提到)。因为计数的递增和递减是在程序运行过程中进行的,当一发现某个对象的计数为0马上可以回收掉。

但是引用计数也有自己的困难:环形引用。比如现在A对象引用B对象,B对象的计数器加1,然后B引用C,C的计数加1,后来C又引用B,B的计数加1得到2。假如现在A不再引用B了,B的计数器成为1。而由于B、C互相引用,形成一个孤岛,但是计数器又没有变成0,又无法回收。这个问题在面向对象这类语言里更加严重,因为环形引用在面向对象里是很普遍的现象。除此之外,使用引用计数实现的垃圾收集方式还会将内存管理的代码和其他代码(比如一个引用更新的时候就要更新计数器)搅混在一起,这跟软件工程所提倡的模块化的原则相违背。

实际上引用计数是如此简单,又很有效的资源管理方法,在很多场景中都会得到应用。比如你可以为了高效的利用资源,不每添加一次引用就拷贝一份资源,你可以只增加引用计数,而不拷贝。

我之前曾做过一个实时监视的系统,安装在客户端上的进程不断的把监视客户端的信息(比如屏幕截图)发送到服务器端。服务器端是一个Web程序,多个管理员可以监视同一个客户端。当一个管理员监视开始监视某个客户端时我就给对应的数据上的一个计数器加1,当停止监视会管理员退出登录时,就减1,当递减为0时服务器端就不再接受客户端的监视数据,并发送停止监视的指令给客户端。这样不仅避免了为每个正在监视的管理员复制一份数据,还很好的控制了数据的生命周期。


原创粉丝点击