年轻代的垃圾收集器

6

我有一个问题 - 在JDK 7中,除了G1之外的所有GC是否都会在年轻代收集时使用停顿式垃圾回收?

谢谢。


特别针对您上面的“(除了G1)”注释:在Oracle和OpenJDK JVM中,G1的年轻代收集器与所有其他HotSpot收集器一样是停顿全局且整体性的。这些JVM中没有非停顿全局的年轻代收集器。 - Gil Tene
3个回答

11

对于OpenJDK、JRockit、IBM JVM和Sun/Oracle JDK,每个可用的收集器的年轻代收集器都总是会停止整个应用的运行。

我所知道的唯一没有停止整个应用的运行的JVM是Azul的Zing。(但不是免费的)

虽然OpenJDK/Hotspot有CMS,但它主要是并发的。仍然有一些需要停止整个应用的运行,并且在某些情况下,CMS将退回到全GC。

据我所知,很难找到G1在暂停时间方面比CMS更快的真实世界的例子,尽管它一直在不断改进。

您的GC日志对您有所帮助吗?


2
具体来说,据我所知,Zing目前是唯一一个在正在使用的JVM中拥有非停止全球年轻代收集器的。对于所有其他JVM(Oracle、OpenJDK、J9、jRockit等)以及他们的所有收集器,年轻代收集都是单片式的停止全球事件。而且这似乎在不久的将来也不会改变。 - Gil Tene

5

所有(几乎)的Java垃圾回收器都有一定程度的停止-全球阶段,其中所有Java线程(而非本地线程)都被暂停,等待独占式系统操作完成。这种状态有时称为安全点。

现代垃圾回收器与应用程序线程同时运行,这意味着垃圾收集器在应用程序线程运行的同时执行其工作。在垃圾收集器处理期间,需要独占访问内存,在此阶段,应用程序Java线程进入安全点状态。

摆脱停止-全球垃圾收集的一种替代方法是选择来自Azul系统的C4收集器的Zing JVM。该实现采用低暂停方法,根本没有停止-全球收集。相反,它使用了一种并发压缩方法,没有停止-全球阶段。


3
Java 7同样支持旧版的并发标记清除(CMS)收集器。CMS是一种低暂停收集器,就像G1一样。
更新:
显然,CMS仅适用于老年代...根据您在http://blogs.oracle.com/jonthecollector/entry/our_collectors找到的博客文章。
这意味着您的建议实际上是正确的。
有人可能会认为所有低暂停收集器: - 需要停止mutator线程来完成某些阶段的工作,并且 - 当无法跟上时,可能会退回到使用标记/扫描收集器的Full GC。
然而,“大多数并发”收集器(如G1和CMS)与其他收集器之间存在质的差异,后者需要在整个收集过程中暂停非GC线程。这正是“停顿整个世界”策略的通常含义。

据我所知,CMS仅用于旧的和永久的代际...? - Alan Harper
你从哪里得到那个“信息”的?我建议你阅读这篇文章 - http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#cms - Stephen C
这个怎么样:https://blogs.oracle.com/jonthecollector/entry/our_collectors - 太旧了吗? - Alan Harper
CMS的“mostly concurrent”部分是指非压缩老年代收集。ParNew(CMS的年轻代收集器)是完全停顿的收集器,没有任何并发性。 - Gil Tene
G1并不是(也不会假装成)一个大多数情况下并发的垃圾收集器,即使对于老年代也是如此。它确实使用了大多数情况下并发的标记方式,但其增量疏散完全是停顿整个系统的。 - Gil Tene
CMS不仅适用于老一代,而且它的年轻收藏与其他Hotspot GC算法一样STW。它使用多个线程,就像吞吐量收集器一样,与串行收集器相反。 - andresp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接