2012-07-25 13 views
8

Quiero crear un perro guardián nagios para JVM que se ve cuando la JVM se queda sin memoria y la reinicia.¿Cómo reiniciar JVM cuando se agota la memoria usando la monitorización JMX?

Actualmente pude configurar la JVM para permitir JMX pero no sé cómo detectar la condición OutOfMemory y reiniciarla.

/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

+1

desafortunadamente, el jdk estándar tiene _no_ forma de detectar que un jvm ha golpeado a OOM. fui a través de esto mismo en nuestro producto. Terminé instalando un controlador de registro que busca LogRecords que contienen un OOME. funciona siempre que ningún código se trague el error sin informarlo. – jtahlborn

+0

encontré algunas API prometedoras a través de la API de herramientas java, pero concluí que cualquier solución implicaría la implementación de código nativo en un agente de herramientas, que fue un "no ir" para nosotros. – jtahlborn

Respuesta

1

no creo que va a ser capaz de detectar una condición de falta de memoria utilizando JMX. Si la JVM está realmente al final de su vida útil, es muy probable que las conexiones JMX arrojen excepciones OOM cuando intente conectarse.

Detectamos alto condiciones de memoria en lugar de OOM. Alarmamos cuando la memoria libre de nuestros sistemas cae por debajo de una marca de agua durante un cierto período de tiempo. También tenemos hilos que se ejecutan para volcar archivos métricos por servidor. Como el subproceso ya está asignado, puede volcar confiablemente la información de memoria del sistema después de que se agote la JVM.

Registramos:

// free memory 
Runtime.getRuntime().freeMemory() 
// current heap usage 
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory() 
+3

Si quisiera saber si empezaba a quedarse sin memoria disponible, ¿no necesitaría usar 'Runtime.getRuntime(). MaxMemory()'? Dado que 'totalMemory()' se basa en lo que la JVM tiene en la JVM en ese momento (es decir, podría crecer). La memoria esencialmente disponible sería 'Runtime.getRuntime(). MaxMemory() - Runtime.getRuntime(). TotalMemory() + Runtime.getRuntime(). FreeMemory() '. –

12

Si está utilizando Java 1.4.2 o posterior, esta opción le permite ejecutar un comando definido por el usuario cuando se produce la primera excepción OutOfMemeory: -XX:OnOutOfMemoryError="<cmd args>;<cmd args>"

que debería darte algunas opciones decentes p.ej. podría iniciar un control pasivo a nagios para indicarle que el servidor se está reiniciando, y luego iniciar un script de shell para detener/iniciar su JVM errónea.

Cuestiones relacionadas