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

How should I tune CMS for my application?

问题是这样的

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

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

分配模式是这样的:

分配了很多短期对象。所以我们使用了一个很大的年轻一代,2GB。幸存者 space 未调整。 MaxTenuringThreshold 设置为 15。CMS 每隔几个小时启动一次。

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

通常程序没有太多工作要做,但每隔几个小时(我们无法预测何时)我们就会非常忙。 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

来更频繁地 运行