我正在运行一个构建系统。我们曾经使用 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=4
20G 堆,默认应该是 5。
我正在使用 Java HotSpot(TM) 64-Bit Server VM 1.7.0_76,Oracle Corporation
你有什么建议?我有明显的错误吗?要改变什么?我只给 Java 20G 是不是很贪心?这里的假设是,给它太多堆意味着更长的 GC,因为要清理的只是更多(农民逻辑)。
PS:申请不是我的。对我来说,它是一个盒子产品。