如何使用JMX监视在内存不足时重启JVM?

sor*_*rin 8 java jmx

我想为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}
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*las 12

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

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


Gra*_*ray 1

我认为您无法使用 JMX 检测内存不足的情况。如果 JVM 确实已达到其生命周期,那么当您尝试连接时,JMX 连接很可能会自行抛出 OOM 异常。

我们检测内存情况而不是 OOM。当系统的可用内存在一定时间内低于某个水位线时,我们会发出警报。我们还有运行来转储每个服务指标文件的线程。由于线程已经被分配,它可以在 JVM 耗尽后可靠地转储系统内存信息。

我们记录:

// free memory
Runtime.getRuntime().freeMemory()
// current heap usage
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()
Run Code Online (Sandbox Code Playgroud)

  • 如果您想知道是否开始耗尽可用内存,那么您不需要使用“Runtime.getRuntime().maxMemory()”吗?因为“totalMemory()”基于当时 JVM 中的内存(即它可能会增长)。本质上可用的内存是“Runtime.getRuntime().maxMemory() - Runtime.getRuntime().totalMemory() + Runtime.getRuntime().freeMemory()”。 (3认同)