====== 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 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 -XX:-HeapDumpOnOutOfMemoryError En este caso tiene un signo - que quiere decir que no lo tiene activado. Lo activamos poniendo el signo +: # jinfo -flag +HeapDumpOnOutOfMemoryError Comprobamos que lo tiene activado: # jinfo -flag HeapDumpOnOutOfMemoryError -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_.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 "". 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