2017-09-28 69 views
1

问题是这样的。我应该如何为我的应用程序调整CMS?

我们正在使用CMS并遇到并发模式故障(需要大约15秒)。使用JRE 8.

已使用UseCMSInitiatingOccupancyOnly和CMSInitiatingOccupancyFraction(80%)。不使用CMSScavengeBeforeRemark。

分配模式是这样的:

大量短期对象的分配。所以我们正在使用一个大的年轻一代,2GB。幸存者空间未调整。 MaxTenuringThreshold设置为15.每隔几个小时CMS进入。

老一代是4GB。内存使用率很高。每次收集后,老一代拥有约30%的自由空间。不幸的是没有更多的可用内存我们计划修改程序以使其占用较少的内存,但这需要时间。

通常程序没有太多的工作要做,但每隔几个小时(我们无法预测何时)我们真的很忙。而15秒的STW太长了。

所以我的问题是:

我们如何调整我们的程序的CMS?

我应该增加老一代(并减少年轻)吗?

我应该调整Survivor吗?

我应该改变CMSInitiatingOccupancyFraction吗?

G1GC会帮忙吗?

+0

+ XX:+ UseParallelOldGC?考虑到你有足够的内核,通常对于小堆来说是更好的选择。 –

+0

@AlexeyRagozin我们根本不需要STW(除了0.x秒)。如果调优CMS不起作用,我们可能会修改代码。 – ntysdd

+0

如果您所需要的仅仅是亚秒暂停并且有4GB堆,那么并行收集器应该能够做到这一点,前提是您拥有足够的内核,而不是极其参考繁重的工作负载。 – the8472

回答

0

老一代是4GB。 遇到并发模式故障(大约需要15秒)。

这不完全是一个大堆。如果您遇到单线程的并发模式故障,那么您可以使用并行收集器来处理该大小。

所以我们正在使用一个大的年轻一代,2GB。

这是相对巨大的,考虑到4GB的整体堆大小,你应该缩小年轻一代,以便老一代拥有超过30%的呼吸空间。 。

每隔几个小时CMS踢

然后,你可以你试过能力运行更频繁地通过降低IHOP

+0

CMS不是压缩收集器。如果我允许短命的对象太容易进入终身空间,它是不是会破坏堆并强制STW? – ntysdd

+0

可能更多碎片化,但也有更多的空间容量来处理它 – the8472

相关问题