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

时间:2012-10-11 15:12:27

标签: java garbage-collection profiling

这些是我在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%的免费时间,这样如果我们下降到那些单位数字,我们就知道存在某种问题,例如:内存泄漏。

2 个答案:

答案 0 :(得分:2)

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

-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=N

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

答案 1 :(得分:0)

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

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