问题是这样的。
我们正在使用 CMS 并遇到并发模式故障(大约需要 15 秒)。使用 JRE 8。
已经在使用 UseCMSInitiatingOccupancyOnly 和 CMSInitiatingOccupancyFraction (80%)。不使用 CMSScavengeBeforeRemark。
分配模式是这样的:
分配了许多短期对象。所以我们使用了一个大的年轻代,2GB。幸存者空间未调整。MaxTenuringThreshold 设置为 15。每隔几个小时 CMS 就会启动。
老一代是4GB。内存使用率很高。每次收集后,老年代大约有 30% 的空闲空间。不幸的是,没有更多的可用内存。我们正计划修改程序以使其使用更少的内存,但这需要时间。
通常程序没有太多工作要做,但每隔几个小时(我们无法预测何时)我们就会变得非常忙碌。15 秒的 STW 实在是太长了。
所以我的问题是:
我们如何为我们的程序调整 CMS?
我应该增加老一代(减少年轻一代)吗?
我应该调整幸存者吗?
我应该更改 CMSInitiatingOccupancyFraction 吗?
G1GC 会有帮助吗?