快速业务通道

Java理论与实践: 垃圾收集简史 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
求编译器或者运行时环境的重要 配合,如当进行指针分配时更新引用计数。这增加了编译器的工作,因为它必须 生成这些簿记指令,同时增加了运行时环境的开销,因为它必须执行这些额外的 指令。这些要求对性能有什么影响呢?它是否会干扰编译时优化呢?

不管选择什么算法,硬件和软件的发展使垃圾收集更具有实用性。20 世纪 70 和 80 年代的经验研究表明,对于大型 Lisp 程序,垃圾收集消耗 25% 到 40% 的运行时。垃圾收集还不能做到完全不可见,这肯定还有很长的路要走。

基本算法

所有垃圾收集算法所面临的问题是相同的 ―― 找出由分配器分配的,但是 用户程序不可到达的内存块。不可到达是什么意思?可以以两种方式之一访问内 存块 ―― 或者用户程序在 根 (root)中有对这一内存块的引用,或者在另一个 可到达的块中有对这个块的引用。在 Java 程序中,根是对静态变量中或者活跃 的堆栈框架上的本地变量中所包含的对象的引用。可到达的对象集是指向关系下 根集的传递闭包。

Java理论与实践: 垃圾收集简史(2)

时间:2010-12-22 IBM Brian Goetz

引用计数

最直观的垃圾收集策略是引用计数。引用计数很简单,但是需要编译器的重 要配合,并且增加了赋值 函数 (mutator)的开销(这个术语是针对用户程序的 ,是从垃圾收集器的角度来看的)。每一个对象都有一个关联的引用计数 ―― 对该对象的活跃引用的数量。如果对象的引用计数是零,那么它就是垃圾(用户 程序不可到达它),并可以回收。每次修改指针引用时(比如通过赋值语句), 或者当引用超出范围时,编译器必须生成代码以更新引用的对象的引用计数。如 果对象的引用计数变为零,那么运行时就可以立即收回这个块(并且减少被回收 的块所引用的所有块的引用计数),或者将它放到迟延收集队列中。

许多 ANSI C++ 库类,比如 string ,使用了引用计数来提供垃圾收集的特 性。通过重载赋值操作符并利用 C++ 作用域提供的确定性结束,C++ 程序可以 将 string 类当成是被收集的垃圾那样使用。引用计数很简单,很适用于增量收 集,收集过程一般会得到好的引用区域性,但是出于几个理由,它很少在生产垃 圾收集器中使用,如它不能回收不可到达的循环结构(彼此直接或者间接引用的 几个对象,如循环链接的列表或者包含指向父节点的反向指针的树)。

跟踪收集器

JDK 中的标准垃圾收集器都没有使用引用计数,相反,它们都使用某种形式 的 跟踪收集器 (tracing collector)。跟踪收集器停止所有工作(尽管不需要 在收集的整个过程中都这样)并开始跟踪对象,从根集开始沿着引用跟踪,直到 检查了所有可到达的对象。可以在程序注册表中、每一个线程堆栈中的(基于堆 栈的)局部变量中以及静态变量中找到根。

标记-清除收集器

最早由 Lisp 的发明人 John McCarthy 于 1960 年提出的最基本的跟踪收集 器形式是 标记―清除收集器,它停止所有工作,收集器从根开始访问每一个活 跃的节点,标记它所访问的每一个节点。走过所有引用后,收集就完成了,然后 就对堆进行清除(即对堆中的每一个对象进行检查),所有没有标记的对象都作 为垃圾回收并返回空闲列表。图 1 展示了垃圾收集之前的堆,阴影块是垃圾, 因为用户程序不能到达它们:

图 1. 可到达和不可到达的对象

Java理论与实践: 垃圾收集简史 - 编程入门网

标记-清除实现起来很简单,可以容易地回收循环的结构,并且不像引用计数 那样增加编译器或者赋值函数的负担。但是它也有不足 ―― 收集暂停可能会很 长,在清除阶段整个堆都是可访问的,这对于可能有页面交换的堆的虚拟内存系 统有非常负面的性能影响。

标记-清除的最大问题是,每一个活跃的(即已分配的)对象,不管是不是可 到达的,在清除阶段都是可以访问的。因为很多对象都可能成为垃圾,这意思着 收集器花

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号