几天后,GC暂停变得非常长

Erk*_* M. 7 java garbage-collection jvm memory-leaks g1gc

我正在运行构建系统.我们曾经使用CMS收集器,但是我们开始在非常长的完整GC循环中受苦,吞吐量(不做GC的时间)大约是90%.所以我现在决定切换到G1,假设即使我有更长的GC总时间,暂停也会更短,从而确保更高的可用性.因此,这个想法似乎比我所做的更好,我看到近3天没有完整的GC,吞吐量为97%,整体GC性能更好.(所有截图和数据均来自GCViewer)

正常

直到现在(第6天).今天系统只是去了berzerk.使用的旧空间仅略低于100%.我看到Full GC几乎每2-3分钟就会触发一次: Berzerk!

旧空间利用: 旧空间

堆大小为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
Run Code Online (Sandbox Code Playgroud)

加上日志标志.我似乎缺少的是-XX:+ParallelGCThreads=20(我有32个处理器),默认应该是8.我也从oracle中读到它会被建议-XX:+G1NewSizePercent=4为20G堆,默认应该是5.

我正在使用Oracle公司的Java HotSpot(TM)64位服务器VM 1.7.0_76

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

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

the*_*472 1

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

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

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

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

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