8

I want to create a nagios watchdog for JVM that looks when the JVM runs out of memory and restarts it.

Currently I was able to setup the JVM be allow JMX but I don't know how to detect OutOfMemory condition and restart it.

 /check_jmx -U service:jmx:rmi:///jndi/rmi://127.0.0.1:1100/jmxrmi -O "java.lang:type=Memory" -A "HeapMemoryUsage" -K used -I HeapMemoryUsage -J used -vvvv
 JMX OK HeapMemoryUsage.used=957414288{committed=2415984640;init=2147483648;max=2863333376;used=957414288}

https://github.com/tcurdt/nagios-check-jmx

4

2 回答 2

12

如果您使用的是 Java 1.4.2 或更高版本,则此选项允许您在第一个 OutOfMemory 异常发生时执行用户定义的命令:-XX:OnOutOfMemoryError="<cmd args>;<cmd args>"

那应该给你一些不错的选择。例如,您可以启动对 nagios 的被动检查,告诉它服务器正在重新启动,然后启动一个 shell 脚本来停止/启动错误的 JVM。

于 2012-07-25T18:42:36.457 回答
1

我认为您将无法使用 JMX 检测到内存不足的情况。如果 JVM 真的到了生命的尽头,那么当您尝试连接时,JMX 连接很可能会自己抛出 OOM 异常。

我们检测内存条件而不是 OOM。当我们系统的可用内存在一定时间内低于某个水位线时,我们会发出警报。我们也有线程运行以转储每个服务的度量文件。由于线程已经分配,​​它可以在 JVM 用完后可靠地转储系统内存信息。

我们记录:

// free memory
Runtime.getRuntime().freeMemory()
// current heap usage
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()
于 2012-07-25T17:17:06.663 回答