我们有一个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
有没有更好的办法?
最佳答案
根据我的观察,“最大值”值会波动。监视一个示例Java进程,使用的堆会按照您的期望变化,但是随着使用的堆接近这些限制,提交的值和最大值也会动态变化(我相信比率是可配置的)。
在我的情况下,Xmx标志设置为9 GiB,奇怪的是,提交的值和最大值偶尔超过了此值(9.2 GiB)?
Java倾向于大量使用可用的堆空间,因此偶尔使用的堆大小达到100%不会困扰我。相反,我对过去5分钟,10分钟和15分钟的平均时间更感兴趣,如果长时间使用的堆保持在90%以上,您可能会遇到问题-检查GC开销将是一个很好的指标(和任何OOME的)。