2009-08-25 8 views
7

Tengo una aplicación que se ejecuta en Websphere Application Server 6.0 y se bloquea casi todos los días debido a falta de memoria. De verbose GC es cierto que hay pérdidas de memoria (muchos de ellos)Cómo detectar condiciones de falta de memoria?

Lamentablemente, la aplicación es proporcionada por un proveedor externo y obtener las cosas arregladas es lento & proceso doloroso. Como parte del proceso, necesito recopilar los registros y los volcados de almacenamiento cada vez que se produce el OOM.

Ahora estoy buscando una forma de automatizarlo. El problema fundamental es cómo detectar la condición OOM. Una forma sería crear un script de shell que buscará periódicamente nuevos heapdumps. Este enfoque me parece un poco sucio. Otro enfoque podría ser aprovechar el JMX de alguna manera. Pero tengo poca o ninguna experiencia en esta área y no tengo mucha idea de cómo hacerlo.

¿O en WAS hay algún tipo de gatillo/ganchos para esto? ¡Muchas gracias por cada consejo!

Respuesta

4

Veo dos opciones si quiere que el volcado de pila sea automatizado pero @Mark's solution con el volcado de pila en OOM no es satisfactorio.

  1. Puede utilizar el MemoryMXBean para detectar la presión de memoria alta, y luego programmatically create a heap dump si el uso (o delta uso) parece alta.
    • Puede obtener periódicamente información de uso de memoria y generar volcados de almacenamiento dinámico con un script de shell cron usando jmap (funciona tanto de forma local como remota).

Sería bueno si pudiera tener una devolución de llamada de OOM, pero, uhm, que acaba de devolución de llamada, probablemente se estrellaría con un error OOM. :)

9

Puede pasar los siguientes argumentos a la JVM al inicio y se generará automáticamente un volcado de pila en un OutOfMemoryError. El segundo argumento le permite especificar la ruta para el archivo de volcado de almacenamiento dinámico. Al usar esto, al menos, podría verificar la existencia de un archivo específico para ver si se ha producido un volcado de almacenamiento dinámico.

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=<value> 
+0

Gracias. Estoy usando esto, pero necesito algún tipo de notificación de que heapdump ha sido creado. Y estoy buscando un mejor enfoque que escanear periódicamente el sistema de archivos. –

+0

Actualicé mi respuesta, por lo que solo necesitaría verificar la existencia de un archivo específico. No estoy seguro de que haya un mejor enfoque. – Mark

+2

Simplemente use algo como esto para notificarle: -XX: OnOutOfMemoryError = "echo PID% p acaba de generar un heapdump | mail [email protected]" para enviarle por correo o ejecutar cualquier comando que desee notificarle. – HaveAGuess

1

Y alternativa a esperar hasta que la aplicación se ha estrellado puede ser a la escritura de un reinicio controlado como todas las noches si usted es optimista de que puede sobrevivir durante doce horas ..

Tal vez incluso puede hacer que WebSphere para ti !?

+0

bueno, esto me ayudaría a corto plazo. Por otro lado, necesito que se reparen las fugas. Y este enfoque me evitaría reunir los registros cuando ocurra OOM. –

+0

Ahh, pensé que solo tenía que esperar hasta que su proveedor externo haya resuelto los problemas ... Claro, si necesita los volcados de hash para los informes, es una historia diferente :) –

1

Puede agregar un detector (clase de ámbito de sesión o detector de atributo de ámbito de aplicación) que se llamaría cada vez que se agrega un nuevo objeto en el ámbito de sesión/aplicación.

En este - se puede tratar de comprobar la memoria total utilizada por la aplicación (Log ella) como como llamada de ejecución GC (tenga en cuenta que la invocación que no implica gc siempre de ejecución)

(Lo anterior es para el logging part and gc basado en el crecimiento del uso)

Para programar gc: Además, puede mantener una clase de tarea de temporizador que se ejecuta cada pocas horas y solicita gc.

+0

Gracias por su respuesta. Lamentablemente, la ejecución de GC no ayuda si hay fugas de memoria (= referencias no deseadas a los objetos) De los gráficos de GC detallado, puedo ver que Garbage Collector se activa muy a menudo antes que OOM. –

+0

En ese caso, si conoce los objetos activos adicionales que no están en uso, puede eliminarlos del alcance (aplicación/sesión) después de un período de tiempo definido. – techzen

3

¿Has mirado JConsole? Utiliza JMX para darle visibilidad de una variedad de métricas de JVM, incluida la información de memoria. Probablemente valga la pena monitorear su aplicación usando esto para comenzar, para tener una idea de cómo/cuándo se consume la memoria. Es posible que la memoria se consuma de manera uniforme durante el día o cuando se utilizan ciertas funciones.

Eche un vistazo a la sección detecting low memory del enlace de arriba.

Si lo necesita, puede escribir un JMX client para ver la aplicación automáticamente y desencadenar las acciones necesarias. JConsole indicará qué métodos JMX necesita para sondear.

0

¿Has echado un vistazo a la herramienta jvisualvm en los últimos Java 6 JDK's?

Es ideal para inspeccionar el código de ejecución.

0

Discutiría que necesita los volcados del montón cuando ocurre el OOM. La recopilación periódica de la información a lo largo del tiempo debería dar una idea de lo que está sucediendo.

Como se ha observado, existen varias herramientas para analizar estos problemas. He tenido éxito con ITCAM for WebSphere, como IBMer tengo acceso inmediato a eso. Rápidamente pudimos identificar las líneas exactas de código en nuestra situación problemática.

Si hay alguna manera de que pueda obtener una herramienta de esa naturaleza, ese es el camino a seguir.

1

Nuestra experiencia con ITCAM ha sido menos que estelar desde la perspectiva del monitoreo. Lo tiramos a favor de CA Wily Introscope.

0

Debería ser posible escribir un programa simple para obtener la lista de procesos del kernel y escanearla para ver si su proceso WAS aún se está ejecutando. En una caja de Unix probablemente puedas utilizar algo en Perl en pocos minutos (si conoces a Perl), sin estar seguro de lo difícil que sería con Windows. Ejecútelo como una tarea programada cada cinco minutos más o menos, y si el proceso no aparece, puede hacer que bifurque otro proceso que se ocupe del volcado de pila y vuelva a iniciar WAS.

Cuestiones relacionadas