您如何确定大型 Java 应用程序的 CMSInitiatingOccupancyFraction?

How do you determine the CMSInitiatingOccupancyFraction for large Java applications?

我们正在使用用 Java 编写的数据库 (Apache Geode)。我们的服务器有 64g RAM,因此我们将 Java 堆(Xms 和 Xmx)设置为大约 62g RAM。

我见过的大多数 Java 针对此类情况的建议是使用 CMS 垃圾收集器,并将 CMSInitiatingOccupancyFraction 设置在 68% 左右(略有不同,但不多)。

但我的问题是:为什么我们不能将垃圾回收设置为从 95% 而不是 68% 开始? 运行 Java 这样的方式似乎很浪费,你永远不能使用超过 68% 的堆,而不会导致不间断的垃圾收集。

它困扰着我们,因为我们正处于数据库不间断垃圾收集的阶段,当 JVM 实际上有 18 GB 空闲时,很难证明更多 RAM 是合理的。 :)

提前感谢您的任何建议。

我认为评论中的答案,加上我设法弄清楚的一些事情,几乎可以回答我的问题。

似乎问题之一是碎片化。您可以有 20% 的堆空闲(80% 已使用),但您的堆可能严重碎片化,很难找到操作所需的大的连续块。如果你更早地开始 运行 GC,比如在 70%,你可以通过回收未使用的对象并为新对象创建更大的空洞来更好地控制碎片。

对于像 CMS 这样的 non-compacting GC,不能 100% 保证您永远不会变得过于碎片化而无法分配内存块,但是如果您尽早收集并且经常收集,则可以使这种情况发生的频率降低尽可能。