java - 我应该如何针对我的应用程序调整 CMS?

标签 java garbage-collection concurrent-mark-sweep

问题是这样的。

我们正在使用 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/

相关文章:

java 深度优先搜索

java - 如何在 Linux 机器上的 Tomcat 上运行 Web 应用程序时使用 JVM 参数

Java ConcurrentMarkSweep 垃圾收集器不清除所有垃圾

java - 为什么 JVM 不断进行 full gc,而老一代只有半满?

java - 通过拦截器或监听器或预处理器覆盖特定的 guice 绑定(bind)

java - 如何让BitSet不被简化【JAVA】

内存管理

javascript - 将对象转换为 JSON 字符串并将其置空

java - 是否始终调用 gc,即使堆空间在运行时连续可用?

java - 了解 Google App Engine 数据存储区