为什么垃圾收集器没有比单个数字堆空闲%更快地进行更积极的垃圾收集?

这些是WebLogic 11g中的Sun Hotspot 1.6 JVM堆设置:

-Xms10g -Xmx10g -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:ParallelGCThreads=2 -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:ConcGCThreads=2 

我在JVM堆免费%图表中看到的24小时基本上是无堆的%以较慢的速度下降,直到我们达到约9%(大约需要24小时)。 然后系统运行看起来像一个完整的gc并回到97%。

是否有一些我应该添加/修改的设置会告诉JVM比我们低于10%的堆免费更快地完成这个完整的GC? 例如一些比例设定?

它不会导致等待我们获得9%免费的问题,但它会使监控/警报变得更加困难。 理想情况下,我们希望始终保持高于30%的免费使用率,这样如果我们下降到那些单位数字,我们就知道存在某种问题,例如内存泄漏。

使用其他stackoverflow文章的组合找到答案。

 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=N 

其中N大致占用的百分比将触发完整的GC。 默认值是~92,这就是为什么我看到完全GC的9%免费。 将其切换为65适用于我的用例。 完整的GC现在可以免费使用35%。

如何删除:-Xms10g,然后监视堆的总大小? 这也会导致gc更频繁地运行。

如果您的应用程序只使用300MB的RAM(3%),那么从10 GB的分配开始似乎是极端的。