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
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
./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
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
java -jar ha447.jar
Saca un árbol de los sospechosos de memory leak