问题是这样的。我应该如何为我的应用程序调整CMS?
我们正在使用CMS并遇到并发模式故障(需要大约15秒)。使用JRE 8.
已使用UseCMSInitiatingOccupancyOnly和CMSInitiatingOccupancyFraction(80%)。不使用CMSScavengeBeforeRemark。
分配模式是这样的:
大量短期对象的分配。所以我们正在使用一个大的年轻一代,2GB。幸存者空间未调整。 MaxTenuringThreshold设置为15.每隔几个小时CMS进入。
老一代是4GB。内存使用率很高。每次收集后,老一代拥有约30%的自由空间。不幸的是没有更多的可用内存我们计划修改程序以使其占用较少的内存,但这需要时间。
通常程序没有太多的工作要做,但每隔几个小时(我们无法预测何时)我们真的很忙。而15秒的STW太长了。
所以我的问题是:
我们如何调整我们的程序的CMS?
我应该增加老一代(并减少年轻)吗?
我应该调整Survivor吗?
我应该改变CMSInitiatingOccupancyFraction吗?
G1GC会帮忙吗?
+ XX:+ UseParallelOldGC?考虑到你有足够的内核,通常对于小堆来说是更好的选择。 –
@AlexeyRagozin我们根本不需要STW(除了0.x秒)。如果调优CMS不起作用,我们可能会修改代码。 – ntysdd
如果您所需要的仅仅是亚秒暂停并且有4GB堆,那么并行收集器应该能够做到这一点,前提是您拥有足够的内核,而不是极其参考繁重的工作负载。 – the8472