如何检测低堆情况以进行监视和警报?

时间:2015-08-03 17:40:37

标签: java garbage-collection jvm heap monitoring

当JVM在堆空间上运行不足时,我们监视生产JVM并具有(理想情况下)发送警告的监视触发器。然而,提出有效的检测算法是非常困难的,因为垃圾收集的本质是,在GC启动之前,应用程序通常没有可用的内存。

我可以想到有很多方法可以解决这个问题。例如。监视可用空间,当它变得太低时发出警告,但是当它持续超过一分钟时,将其延迟并仅触发。那么,什么对你有用呢?

特别有趣:

  • 如何检测需要立即反应的关键内存/堆问题?
  • 如何检测需要采取预防措施的堆问题?
  • 什么方法普遍适用?例如。无需使触发器适应某些JVM调整参数,反之亦然,或者在某些时间间隔内强制GC。
  • 是否有广泛使用的最佳做法?

1 个答案:

答案 0 :(得分:2)

我发现JVM内存运行状况的一个非常有效的衡量标准是JVM在垃圾收集中花费的时间百分比。健康且经过良好调整的JVM将使用非常少(<1%左右)的CPU时间来收集垃圾。一个不健康的JVM将会浪费掉#34;大部分时间保持堆清洁,并且在遇到内存泄漏或最大堆设置太低的JVM中,收集时使用的CPU百分比将呈指数级增长(因为使用了更多的CPU来保持堆清洁,更少的是用来做真正的工作&#34; ...假设入站请求率没有减慢,很容易从你成为CPU限制的悬崖上掉下来而且无法获得在你真正得到java.lang.OutOfMemoryError之前很久就完成了足够多的工作。

值得注意的是,这也是你想要防范的条件。如果JVM使用它的所有堆,你实际上并不关心它,只要它能够有效地回收内存而不妨碍&#34;实际工作&#34;它需要做。 (事实上​​,如果您从未达到最大堆大小,您可能需要考虑缩小堆。)

这个统计数据是由许多现代JVM(至少是甲骨文和IBM)提供的。

另一个有效的措施可能是完整的GC之间的时间。您需要执行完整GC的次数越多,您在GC中花费的时间就越多。