问题是这样的。
我们正在使用CMS并遇到并发模式故障(大约需要15秒)。使用JRE 8。
已经使用UseCMSInitiatingOccupancyOnly和CMSInitiatingOccupancyFraction(80%)。不使用CMSScavengeBeforeRemark。
分配模式是这样的:
分配了许多短期对象。所以我们正在使用2GB的年轻一代。幸存者空间没有调整。 MaxTenuringThreshold设置为15.每隔几个小时CMS就会启动。
老一代是4GB。内存使用率很高。每次收集后,老一代有大约30%的可用空间。不幸的是没有更多的内存。我们计划修改程序以减少内存使用,但这需要时间。
通常程序没有太多工作要做,但每隔几个小时(我们无法预测何时)我们就会非常忙碌。 15秒的STW太长了。
所以我的问题是:
我们如何为我们的计划调整CMS?
我应该增加老一代(并减少年轻人)?
我应该调整幸存者吗?
我应该更改CMSInitiatingOccupancyFraction吗?
G1GC会帮忙吗?
答案 0 :(得分:0)
老一代是4GB。 遇到并发模式故障(大约需要15秒)。
这不是一个很大的堆。如果您遇到单线程的并发模式故障,您也可以使用该规模的并行收集器。
所以我们正在使用2GB的年轻一代。
这是比较大的,考虑到整体堆大小为4GB,你应该缩小年轻一代,以便老一代拥有超过30%的喘息空间。
每隔几个小时,CMS就会开始。
然后你可以通过减少IHOP来更频繁地运行