我正在运行构建系统。我们曾经使用CMS收集器,但是我们开始在非常长的完整GC循环中受苦,吞吐量(不做GC的时间)大约是90%。所以我现在决定切换到G1,假设即使我有更长的GC总时间,暂停也会更短,从而确保更高的可用性。因此,这个想法似乎比我所做的更好,我看到近3天没有完整的GC,吞吐量为97%,整体GC性能更好。 (所有屏幕截图和数据均来自GCViewer)
直到现在(第6天)。今天系统只是去了berzerk。使用的旧空间仅略低于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 。
我正在使用Oracle HotSpot(TM)64位服务器VM 1.7.0_76,Oracle Corporation
你会建议什么?我有明显的错误吗?有什么改变? 我只给Java 20G贪婪吗?这里的假设是,给它太多的堆将意味着更长的GC,因为有更多的清理(农民逻辑)。
PS:申请不是我的。对我来说它是一个盒子产品。
答案 0 :(得分:1)
你会建议什么?我有明显的错误吗?有什么改变?我只给Java 20G贪婪吗?这里的假设是,给它太多的堆将意味着更长的GC,因为有更多的清理(农民逻辑)。
如果它触发了完整的GC,但你的占用率接近20GB,那么GC可能根本没有足够的喘息空间,以满足巨额拨款的需求或者达到某些目标(吞吐量,暂停时间),迫使完整的GC作为后备。
因此,您可以尝试增加堆限制或放宽吞吐量目标。
正如我在评论中提到的那样,你也可以尝试升级到java8以改进G1启发式。
进一步的建议GC日志涵盖" berzerk"行为会很有用。