我想为JVM创建一个nagios监视程序,它可以查看JVM内存不足并重新启动它。
目前我能够设置JVM是允许JMX但我不知道如何检测OutOfMemory条件并重新启动它。
/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}
答案 0 :(得分:12)
如果您使用的是Java 1.4.2或更高版本,则此选项允许您在出现第一个OutOfMemeory异常时执行用户定义的命令:-XX:OnOutOfMemoryError="<cmd args>;<cmd args>"
那应该给你一些体面的选择。例如你可以开始对nagios进行被动检查,告诉它服务器正在重启,然后启动shell脚本来停止/启动错误的JVM。
答案 1 :(得分:1)
我认为您无法使用JMX检测到内存不足的情况。如果JVM真的处于生命的终点,那么当您尝试连接时,JMX连接很可能会自己抛出OOM异常。
我们检测高内存条件而不是OOM。当我们的系统的自由存储器在一定时间内低于某个水印时,我们会发出警报。我们还有运行转储每服务度量标准文件的线程。由于线程已经分配,因此可以在JVM用完后可靠地转储系统内存信息。
我们记录:
// free memory
Runtime.getRuntime().freeMemory()
// current heap usage
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()