当JVM在堆空间上运行不足时,我们监视生产JVM并具有(理想情况下)发送警告的监视触发器。然而,提出有效的检测算法是非常困难的,因为垃圾收集的本质是,在GC启动之前,应用程序通常没有可用的内存。
我可以想到有很多方法可以解决这个问题。例如。监视可用空间,当它变得太低时发出警告,但是当它持续超过一分钟时,将其延迟并仅触发。那么,什么对你有用呢?
特别有趣:
答案 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中花费的时间就越多。