Java堆空间监控 - 我们做错了吗?

时间:2011-10-11 12:38:12

标签: java java-memory-model

我们有一个Nagios检查,用于检查某些Tomcat实例上的堆内存状态。它用于从VM获取指标的命令如下:

java -jar /usr/java/cmdline-jmxclient-0.10.3.jar - localhost:17757 java.lang:type=Memory HeapMemoryUsage

产生如下输出:

committed: 132579328
init: 134217728
max: 401014784
used: 18831512

如果针对used的值大于max的值的90%,则会启动提醒。这对我来说似乎是有缺陷的,主要是因为max的价值可以下降而且上涨:)

我们应该使用哪些信息来正确监控堆空间的消耗?

我应该将maxXmx的值进行比较吗?

我可以使用以下命令检索Xmx的值:

java -jar /usr/java/cmdline-jmxclient-0.10.3.jar - localhost:17757 java.lang:type=Runtime InputArguments

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

根据我的观察,“最大”值波动。监视示例Java进程,使用的堆会随着您的预期而变化,但是当使用的堆接近这些限制时,已提交的值和最大值也会动态调整大小(我相信比率是可配置的)。

就我而言,Xmx标志设置为9 GiB,奇怪的是,提交值和最大值偶尔会超过这个值(9.2 GiB)?

Java倾向于积极使用可用的堆空间,因此使用的堆大小偶尔达到100%不会打扰我。相反,我对最后5,10和15分钟的平均值更感兴趣等。如果使用的堆长时间保持在90%以上,则可能有问题 - 检查GC开销是一个很好的指标(而任何OOME显然都是。)