我们有一个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


有没有更好的办法?

最佳答案

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

在我的情况下,Xmx标志设置为9 GiB,奇怪的是,提交的值和最大值偶尔超过了此值(9.2 GiB)?

Java倾向于大量使用可用的堆空间,因此偶尔使用的堆大小达到100%不会困扰我。相反,我对过去5分钟,10分钟和15分钟的平均时间更感兴趣,如果长时间使用的堆保持在90%以上,您可能会遇到问题-检查GC开销将是一个很好的指标(和任何OOME的)。

10-04 10:41