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

时间:2015-03-06 14:57:19

标签: java memory-leaks garbage-collection jvm g1gc

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

Normal

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

旧空间利用率: Old space

堆大小为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 。

我正在使用Oracle HotSpot(TM)64位服务器VM 1.7.0_76,Oracle Corporation

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

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

1 个答案:

答案 0 :(得分:1)

  

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

如果它触发了完整的GC,但你的占用率接近20GB,那么GC可能根本没有足够的喘息空间,以满足巨额拨款的需求或者达到某些目标(吞吐量,暂停时间),迫使完整的GC作为后备。

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

正如我在评论中提到的那样,你也可以尝试升级到java8以改进G1启发式。

进一步的建议GC日志涵盖" berzerk"行为会很有用。