我应该如何为我的应用程序调整 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
来更频繁地 运行
问题是这样的
我们正在使用 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
来更频繁地 运行