Java理论与实践: JVM 1.4.1中的垃圾收集 - 编程入门网
的收集要比小的收 集花费长得多的时间。没有办法以编程方式触发小的收集。
其他收集选项 除了默认情况下使用的复制收集器和标记-整理收集器,JDK 1.4.1 还包含其 他四种垃圾收集算法,每一种适用于不同的目的。JDK 1.4.1 包含一个增量收集 器(自 JDK 1.2 就已经出现了)和三种在多处理器系统中进行更有效收集的新 收集器――并行复制收集器、并行清除(scavenging)收集器和并发标记-清除 收集器。这些新收集器是为了解决在多处理器系统中垃圾收集器成为伸缩性瓶颈 这一问题的。图 2 显示了在什么时候选择备用收集选项的指导。 图 2. 1.4.1 垃圾收集选项(Folgmann IT-Consulting 提供) 增量收集 增量收集选项自 1.2 起就成为 JDK 的一部分。增量收集减少了垃圾收集暂 停,以牺牲吞吐能力为代价,这使它只在更短的收集暂停非常重要时才值得考虑 ,如接近实时的系统。 Train算法是 JDK 用于增量收集的算法,它在堆中老的代和年轻的代之间创 建一个新区域。这些堆区域划分为“火车(train)”,每个火车又分为一系列 的“车厢(car)”。每个车厢可以分别收集。结果,每个火车车厢组成单独的 一代,这意味着不但要跟踪老到年轻的引用,而且还要跟踪从老的火车到年轻的 火车以及老的车厢到年轻的车厢的引用。这为赋值函数(mutator)和垃圾收集 器带来了大量的额外工作,但是可以得到更短的收集暂停。 并行收集器和并发收集器 JDK 1.4.1 中新的收集器都是为解决多处理器系统中垃圾收集器的问题而设 计的。因为大多数垃圾收集算法会在一段时间里使系统停止,单线程的收集器很 快会成为伸缩性瓶颈,因为在垃圾收集器将用户程序线程挂起时,除了一个处理 器之外,其他的处理器都是空闲的。新收集器中的两个――并行复制收集器和并 发标记-清除收集器――设计为减少收集暂停时间。另一个是并行清除收集器, 它是为在大堆上的更高吞吐能力而设计的。 并行复制收集器用 JVM 选项 -XX:+UseParNewGC 启用,是一个年轻代复制收 集器,它将垃圾收集的工作分为与 CPU 数量一样多的线程。并发标记-清除收集 器由 -XX:+UseConcMarkSweepGC 选项启用,它是一个老代标记-清除收集器,它 在初始标记阶段(及在以后暂短重新标记阶段)暂短地停止整个系统,然后恢复 用户程序,同时垃圾收集器线程与用户程序并发地执行。并行复制收集器和并发 标记-清除收集器基本上是默认的复制收集器和标记-整理收集器的并发版本。由 -XX:+UseParallelGC 启用的并行清除收集器是年轻代收集器,针对多处理器系 统上非常大(吉字节以及更大的)堆进行了优化。 选择一种算法 有六种算法可以选择,您可能不知道要使用哪一种。图 2提供了一些指导, 将收集器分为单线程和并发的,以及分为短暂停和高吞吐能力的。只要您掌握了 应用程序和部署环境的信息,就足以选择合适的算法。对于许多应用程序,默认 的收集器可以工作得很好――因此如果您没有性能问题,那么就没必要加入更多 的复杂性。不过,如果您的应用程序是部署在多处理器系统上或者使用非常大的 堆,那么改变收集器选项可能会有巨大的性能提升。 微调垃圾收集器 JDK 1.4.1 还包括大量的微调垃圾收集的选项。调整这些选项并衡量它们的 效果可能会花费您大量时间,因此在试图微调垃圾收集器之前先对您的应用程序 进行彻底的配置(profile)和优化,这样您的微调工作可能会得到更好的结果 。 微调垃圾收集首先要做的是检查冗长的 GC 输出。这会使您得到垃圾收集操 作的频率、定时和持续时间等信息。最简单的垃圾收集微调就是扩大最大堆的大 小( -Xmx )。随着堆的增大,复制收集会变得更有效,所以在增大堆时,您就 减少了每个对象的收集成本。除了增加最大堆的大小,还可以用选项 - XX:New |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |