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

时间:2019-05-07 17:42:42

标签: java jvm-arguments

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

在这种情况下,我看到的大多数Java建议是使用CMS垃圾收集器,并将CMSInitiatingOccupancyFraction设置为68%左右(付出或花一点,但不多)。

但是我的问题是:为什么我们不能将垃圾收集设置为95%而不是68%?以这样一种方式运行Java似乎很浪费,即在不引起不间断垃圾回收的情况下,您绝不能使用超过68%的堆。

这很困扰我们,因为我们正处在数据库不间断垃圾回收的阶段,并且当JVM确实有18个免费演出时,很难证明更多的RAM是合理的。 :)

预先感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

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

似乎要担心的是碎片。您可以有20%的堆可用空间(已使用80%),但是您的堆可能会严重碎片化,难以找到操作所需的大连续块。如果您以70%的速度开始运行GC的早期版本,则可以通过回收未使用的对象并为新对象创建更大的空洞来使碎片控制得更多。

对于像CMS这样的非紧凑型GC,无法100%保证您永远不会变得过于零散,无法分配一块内存,但是如果您尽早收集并且经常可以使这种情况尽可能少发生。 / p>