User Tools

Site Tools


informatica:weblogic:heapdump

HeapDump

Hacer un heapdump en caliente. Para la JVM y el servidor de aplicaciones no responde a peticiones:

jmap -dump:format=b,file=dump.bin <pid>

Añadir el siguiente parámetro para que haga un heapdump cuando hay un out of memory OOM:

  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/weblogic/dumps

Se puede añadir en caliente. Primero miramos si lo tiene activado. Nos tenemos que fijar en el sigo - + delante de Heap:

  # jinfo -flag HeapDumpOnOutOfMemoryError <PID>
  
  -XX:-HeapDumpOnOutOfMemoryError

En este caso tiene un signo - que quiere decir que no lo tiene activado. Lo activamos poniendo el signo +:

# jinfo -flag +HeapDumpOnOutOfMemoryError <PID>

Comprobamos que lo tiene activado:

  # jinfo -flag HeapDumpOnOutOfMemoryError <PID>
  
  -XX:+HeapDumpOnOutOfMemoryError

Generar Heap Dump

Con la aplicación de Hello World y una instancia de -Xms128m -Xmx128m de weblogic, lanzamos un test de Jmeter de 100 Threads con un Loop Count de 10.000 por ejemplo. A mi me ha generado el HeapDump con formato: jrockit_<PID>.hprof

Analizar

Eclipse Memory Analizer

./MemoryAnalyzer

Te hace un pequeño informe de sospechosos de memory leaks:

One instance of "weblogic.servlet.internal.WebAppServletContext" loaded by "sun.misc.Launcher$AppClassLoader 
@ 0xe1e7f018" occupies 15,153,312 (13.88%) bytes. 
The memory is accumulated in one instance of "java.util.concurrent.ConcurrentHashMap$HashEntry[]" loaded by "<system class loader>".

Para indagar el “.war” o “.ear” que lo causa:

https://www-01.ibm.com/support/docview.wss?uid=swg21673014

1. Abrir el archivo “.dmp”

2. Tras muuuucho tiempo se abirá el informe

3. Click en el icono con los engranajes tipo “settings” en la parte superior

4. Click encima del “Object/Stack Frame” que coincida con el ID del thread sospechoso, en este caso tiene el “Retained Heap” más grande

5. En la parte izquierda identificar “contextClassLoader”, igual hay que hacer click en “25 out 36 displayed” o similar para expandir todas las opciones:

Type|Name              |Value
--------------------------------------------------------------------------------
ref |contextClassLoader|com.ibm.ws.classloader.CompoundClassLoader @ 0x6ffd0bb40
--------------------------------------------------------------------------------

6. Situar el ratón encima, botón derecho, “Go into”

7. En la parte izquierda identificar “name”, igual hay que hacer click en “25 out 36 displayed” o similar para expandir todas las opciones:

Type|Name|Value
-------------------------------------------------------
ref |name|war:UN LAGO BLANCO bla bla/MyPortlet.war
-------------------------------------------------------

A partir de aquí la documentación sugiere indicar el .war (o .ear) al desarrollador y que mire

Error: out of memory

https://wiki.eclipse.org/MemoryAnalyzer/FAQ#Out_of_Memory_Error_while_Running_the_Memory_Analyzer

Solución:

1. Editar el .ini:

vim /path/to/math/MemoryAnalyzer.ini

Y añadir al final:

-vmargs
-Xmx14g
-XX:-UseGCOverheadLimit

En este ejemplo se estable el límite de consumo de memoria RAM para la aplicación MAT en 14 GB.

2. Volver a arrancar MAT

Heap Analyzer (IBM)

java -jar ha447.jar

Saca un árbol de los sospechosos de memory leak

informatica/weblogic/heapdump.txt · Last modified: 2019/01/22 08:44 by javi