我们有一个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
的价值可以下降而且上涨:)
我们应该使用哪些信息来正确监控堆空间的消耗?
我应该将max
与Xmx
的值进行比较吗?
我可以使用以下命令检索Xmx的值:
java -jar /usr/java/cmdline-jmxclient-0.10.3.jar - localhost:17757 java.lang:type=Runtime InputArguments
有更好的方法吗?
答案 0 :(得分:1)
根据我的观察,“最大”值波动。监视示例Java进程,使用的堆会随着您的预期而变化,但是当使用的堆接近这些限制时,已提交的值和最大值也会动态调整大小(我相信比率是可配置的)。
就我而言,Xmx标志设置为9 GiB,奇怪的是,提交值和最大值偶尔会超过这个值(9.2 GiB)?
Java倾向于积极使用可用的堆空间,因此使用的堆大小偶尔达到100%不会打扰我。相反,我对最后5,10和15分钟的平均值更感兴趣等。如果使用的堆长时间保持在90%以上,则可能有问题 - 检查GC开销是一个很好的指标(而任何OOME显然都是。)