G1GC仍然没有正式的生产就绪吗?

29

我想知道JDK 7版本中"垃圾优先"(G1)收集器的官方状态如何。我希望可以使用G1作为低暂停的GC替代CMS,但前提是我真正相信它的健壮性。

JDK 7发布之前,G1被宣传为一个闪亮的新GC,将取代CMS收集器并成为JDK 7的默认GC。然而,现在随着Oracle JDK 7u1的发布,G1不是任何我尝试过的机器上的默认GC。

即使在JDK 7中使用-XX:+UseG1GC时不再需要指定-XX:+UnlockExperimentalVMOptions,但这仍是一个正式完全未记录的JVM功能:

Java 7 (JDK 7) garbage collection and documentation on G1

我能找到唯一提到G1的官方文档已经严重过时,早在JDK 7发布之前就编写了:

http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html

例如,官方的“Java HotSpot VM Options”文档(http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html)记录了如何启用和调整其他收集器,但甚至没有提到G1的存在。就好像它不存在一样!

这很令人困惑,我想知道G1的实际状态和未来发展如何。它真的稳定了吗?剩下的问题(如泄漏、虚假崩溃和缺失的仪器支持)是否得到了解决?如果是这样,为什么Oracle将G1GC视为未经记录的(尴尬的?)秘密?G1可能是一个已失败但被静默停止的项目吗?或者我需要支付文档和支持费用吗?还是它只是测试版?有谁能告诉我这里发生了什么?

6个回答

12

询问该问题的地方是hotspot-gc-dev邮件列表。

如果您查看archives,您会发现有很多工作正在进行。很多邮件似乎是提交和审查请求/评论,所以他们正在忙于工作。

我没有找到任何官方新闻公告,但这就是Oracle的工作方式。如果您对来自开发人员之一的非正式和非约束性评论感到满意,您可能可以在该邮件列表上询问他们如何看待这个问题。

编辑:@scravy向邮件列表发送了an email,这是response接收到的内容:

我认为这个问题没有简单的答案,尽管可能不是最佳选择。G1的初始重点是为极大堆提供合理的暂停时间。这意味着今天它可能不适合每个人。我们认为这项技术有很多潜力,也就是说,通过调整,它可以解决许多不同类型的垃圾收集需求。因此,有一天,它可能会成为默认的收集器,但现在还为时过早。
考虑到GC行为的变化可能对现有部署造成很大的干扰,我们不愿意在主要版本发布之前进行这样的转变。因此,在当前版本中,如果您没有指定收集器,我们会尝试做出一些简单的自动选择,但我怀疑我们不会在短期内对该行为进行根本性的改变。
对于关于G1是否受支持的更大问题,目前的答案是否定的。但请记住,Oracle对其付费客户支持的产品作出的支持承诺相当重要,其中涉及的内容远不止满足功能和可靠性要求。
我们继续鼓励每个人测试和评估G1,并向我们提供反馈,因为我们在G1上继续进行重大开发。
-约翰
编辑:根据Oracle网站上的此链接,看起来G1GC现在已经得到全面支持。

我已经发送了一封电子邮件,等待回复 :-) - scravy
@scravy 看起来你已经得到了那个响应!我会在这里发布文本。 - user545680

5

我们已经使用G1GC快一年半了,它在我们的关键事务处理系统中表现出色,并且在高吞吐量、低暂停、并发、多线程和优化的重内存管理方面提供了很好的支持。

我们正在使用以下JVM设置:

-server -d64 -Xms512m -Xmx3072m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC
-XX:+UnlockExperimentalVMOptions -XX:+AggressiveOpts -XX:+DoEscapeAnalysis
-XX:MaxGCPauseMillis=400 -XX:GCPauseIntervalMillis=8000 
-XX:+UseCompressedOops -XX:NewRatio=50

1
根据这个链接:http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html,
G1的开发现在主要集中在解决任何剩余的可靠性问题和提高性能方面。
此外,
就GC暂停时间而言,G1有时比CMS更好,有时更差。正在进行的工作是使G1始终与CMS一样好,甚至更好。
因此,当官方JDK SE 7发布时,G1应该会取代CMS。

那个链接已经被OP发布过了,而且被认为已经过时(估计自2008年以来就没有更新过),那么现在的情况是什么? - scravy
我在搜索互联网后发现的最新内容基本上都是关于今年2月左右的相同信息。 - Jon Egeland

0

G1 GC自Java 7更新4版本发布以来已经可以用于生产环境。

从Oracle的文章(在G1垃圾收集器下)中,您可以找到G1 GC的真实用例。

如果应用程序具有以下一个或多个特征,则今天使用CMS或ParallelOldGC垃圾收集器运行的应用程序将受益于切换到G1。

  1. Full GC持续时间过长或太频繁。
  2. 对象分配速率或晋升速率变化显著。
  3. 不希望的长时间垃圾回收或压缩暂停(超过0.5至1秒)

查看相关问题以获取有关G1GC和需要微调的关键参数的更多详细信息:

Java 7(JDK 7)垃圾收集和G1文档

关于您的其他查询:

G1GC 真的稳定了吗?剩下的问题(如泄漏、虚假崩溃和缺少仪器支持)是否已经解决?如果是这样,为什么 Oracle 把 G1GC 视为未记录的(尴尬的?)秘密?G1 可能是一个失败的项目,现在被悄悄地停止了吗?还是我需要支付文档和支持费用?或者它只是仍然处于测试版?有人可以告诉我这里发生了什么吗?
1. G1GC 是稳定的。 2. 我没有发现这个算法中存在任何泄漏。 3. Oracle 没有让它未记录。您可以在 这里这里 找到更多关于 G1GC 的信息。 4. G1 不是一个失败的项目,G1GC 将成为较新版本的 Java(Java 9)中默认的 GC 算法。 5. 您不需要支付支持费用。它不是测试版。

0
据我所知,G1并不是秘密 - 它已经开放了实验性使用很长时间了 - 至少一两年。每个JavaOne都会有一些关于G1有多好的演讲:)
从非官方渠道获得的消息:这是当前Java工程师的重点之一,最终使G1成为生产就绪状态。他们只是还没有准备好将其开放给JDK 7。请耐心等待:)

0

看起来问题中链接的页面已经更新:

垃圾优先(G1)垃圾收集器在Oracle JDK 7更新4及更高版本中得到全面支持。

(但请注意,对于像ARM这样的嵌入式平台,在7u4中完全不支持。)


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