我应该如何为我的应用程序调整CMS?

时间:2017-09-28 11:03:50

标签: java garbage-collection concurrent-mark-sweep

问题是这样的。

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

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

分配模式是这样的:

分配了许多短期对象。所以我们正在使用2GB的年轻一代。幸存者空间没有调整。 MaxTenuringThreshold设置为15.每隔几个小时CMS就会启动。

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

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

所以我的问题是:

我们如何为我们的计划调整CMS?

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

我应该调整幸存者吗?

我应该更改CMSInitiatingOccupancyFraction吗?

G1GC会帮忙吗?

1 个答案:

答案 0 :(得分:0)

  

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

这不是一个很大的堆。如果您遇到单线程的并发模式故障,您也可以使用该规模的并行收集器。

  

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

这是比较大的,考虑到整体堆大小为4GB,你应该缩小年轻一代,以便老一代拥有超过30%的喘息空间。

  

每隔几个小时,CMS就会开始。

然后你可以通过减少IHOP来更频繁地运行