【发布时间】:2012-10-11 15:12:26
【问题描述】:
这些是我在 WebLogic 11g 中的 Sun Hotspot 1.6 JVM 堆设置:
-Xms10g -Xmx10g -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:ParallelGCThreads=2 -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:ConcGCThreads=2
我在 24 小时的 JVM 堆空闲百分比图中看到的基本上是堆空闲百分比以缓慢的速度下降,直到我们达到大约 9%(大约需要 24 小时)。然后系统运行看起来像一个完整的 gc 并恢复到 97%。
是否有一些我应该添加/修改的设置来告诉 JVM 比当我们得到低于 10% 的堆空闲时更快地执行这个完整的 GC?例如一些比例设置?
它会等到我们达到 9% 的空闲时才会导致问题,但它会使监控/警报变得更加困难。理想情况下,我们希望始终保持高于 30% 的免费,这样如果我们下降到那些个位数,我们就知道存在某种问题,例如内存泄漏。
【问题讨论】:
-
根据我对 java 垃圾收集的理解,它可以在需要时免费收集。您可以调用 system.gc 手动告诉垃圾收集器您有应该释放的东西,但 gc 不必这样做。
-
您可以使用命令 System.gc() 手动进行垃圾收集。
-
您需要查看 Full GC 后使用/释放了多少内存。否则,可用空间对监控没有用处。
-
System.gc()没有明确地运行垃圾收集器,它建议它运行。它不是确定性的。 -
@BestPractices,我建议您更多地考虑这个问题的 why - 我认为您做出了一个错误的假设,即拥有 10G 的空间。泄漏的更好迹象是完整的 GC 无法回收空间,或者随着时间的推移回收的空间量越来越少 - 这不太容易自动监控。
标签: java garbage-collection profiling