问题是这样的。
我们正在使用 CMS 并遇到并发模式故障(大约需要 15 秒)。使用 JRE 8。
已使用 UseCMSInitiatingOccupancyOnly 和 CMSInitiatingOccupancyFraction (80%)。不使用 CMSScavengeBeforeRemark。
分配模式是这样的:
分配了很多短期对象。所以我们使用的是一个很大的年轻代,2GB。幸存者空间未调整。 MaxTenuringThreshold 设置为 15。CMS 每隔几个小时启动一次。
老一代是 4GB。内存使用率很高。每次回收后,老年代都有大约30%的空闲空间。不幸的是没有更多可用内存。我们计划修改程序以使其使用更少的内存,但这需要时间。
通常该程序没有太多工作要做,但每隔几个小时(我们无法预测何时)我们就会变得非常忙碌。 15 秒的 STW 太长了。
所以我的问题是:
我们如何为我们的程序调整 CMS?
我应该增加老年代(并减少年轻代)吗?
我应该调整幸存者吗?
我应该更改 CMSInitiatingOccupancyFraction 吗?
G1GC 有帮助吗?
最佳答案
Old generation is 4GB. experiencing concurrent mode failure (takes about 15 seconds).
这并不完全是一个大堆。如果您遇到单线程并发模式故障,您不妨使用该大小的并行收集器。
So we are using a large young generation, 2GB.
这是相对较大的,考虑到总堆大小为 4GB,您应该缩小年轻一代,以便老一代有超过 30% 的喘息空间。
Every a few hours CMS kicks in.
然后您就可以通过减少 IHOP 来更频繁地运行它
关于java - 我应该如何针对我的应用程序调整 CMS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46467576/