7

我正在运行一个构建系统。我们曾经使用 CMS 收集器,但我们开始遭受非常长的完整 GC 周期,吞吐量(不执行 GC 的时间)约为 90%。所以我现在决定切换到 G1,假设即使我有更长的整体 GC 时间,暂停也会更短,从而确保更高的可用性。所以这个想法似乎比我预期的更有效,我几乎 3 天没有看到完整的 GC,吞吐量为 97%,整体 GC 性能要好得多。(所有截图和数据来自GCViewer

普通的

直到现在(第 6 天)。今天,系统简直发疯了。使用的旧空间仅略低于 100%。我看到 Full GC 几乎每 2-3 分钟触发一次: 狂暴!

旧空间利用: 旧空间

堆大小为 20G(总共 128G RAM)。我目前使用的标志是:

-XX:+UseG1GC
-XX:MaxPermSize=512m
-XX:MaxGCPauseMillis=800
-XX:GCPauseIntervalMillis=8000 
-XX:NewRatio=4
-XX:PermSize=256m
-XX:InitiatingHeapOccupancyPercent=35
-XX:+ParallelRefProcEnabled

加上日志标志。我似乎缺少的是-XX:+ParallelGCThreads=20(我有 32 个处理器),默认应该是 8。我还从 oracle 中读到建议使用-XX:+G1NewSizePercent=420G 堆,默认应该是 5。

我正在使用 Java HotSpot(TM) 64-Bit Server VM 1.7.0_76,Oracle Corporation

你有什么建议?我有明显的错误吗?要改变什么?我只给 Java 20G 是不是很贪心?这里的假设是,给它太多堆意味着更长的 GC,因为要清理的只是更多(农民逻辑)。

PS:申请不是我的。对我来说,它是一个盒子产品。

4

1 回答 1

1

你有什么建议?我有明显的错误吗?要改变什么?我只给 Java 20G 是不是很贪心?这里的假设是,给它太多堆意味着更长的 GC,因为要清理的只是更多(农民逻辑)。

如果它触发了完整的 GC,但您的占用率保持在 20GB 附近,那么 GC 可能根本没有足够的喘息空间来满足大量分配的需求或满足其某些目标(吞吐量、暂停时间),迫使完整的 GC 作为后备。

因此,您可以尝试增加堆限制或放宽吞吐量目标。

正如我之前在评论中提到的,您还可以尝试升级到 java8 以改进 G1 启发式。

如需进一步的建议,涵盖“berzerk”行为的 GC 日志将很有用。

于 2015-03-06T17:12:53.357 回答