Normalmente, lo que yo uso se incluyen dentro ParseHeapDump.sh
Eclipse Memory Analyzer y se describen here, y yo que en una sola nuestros servidores más reforzados (descargue y copie sobre la distribución linux .zip, descomprima allí). El script de shell necesita menos recursos que analizar el almacenamiento dinámico desde la GUI, además puede ejecutarlo en su gran servidor con más recursos (puede asignar más recursos agregando algo como -vmargs -Xmx40g -XX:-UseGCOverheadLimit
al final de la última línea del script. Para ejemplo, la última línea del archivo que podría tener este aspecto después de la modificación
./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "[email protected]" -vmargs -Xmx40g -XX:-UseGCOverheadLimit
Ejecutar como si fuera ./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof
después de eso tiene éxito, se crea una serie de archivos "índice" junto al archivo .hprof.
Después de crear los índices, trato de generar puntúe informes de eso y envíe esos informes a mis máquinas locales y trate de ver si puedo encontrar al culpable solo con eso (no solo los informes, no los índices). Aquí hay un tutorial en creating the reports.
ejemplo de informe:
./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects
Otras opciones de informe:
org.eclipse.mat.api:overview
y org.eclipse.mat.api:top_components
Si esos informes no son suficientes y si necesito un poco más de excavación (es decir,digamos a través de oql), selecciono los índices y el archivo hprof en mi máquina local, y luego abro el volcado de heap (con los índices en el mismo directorio que el volcado de heap) con mi GUI de Eclipse MAT. A partir de ahí, no necesita demasiada memoria para funcionar.
EDIT: yo sólo le gusta añadir dos notas:
- Por lo que yo sé, sólo la generación de los índices es la parte intensiva de memoria de Eclipse MAT. Después de tener los índices, la mayor parte de su procesamiento de Eclipse MAT no necesitaría tanta memoria.
- Hacer esto en un script de shell significa que puedo hacerlo en un servidor sin cabeza (y normalmente lo hago en un servidor sin cabeza, porque normalmente son los más poderosos). Y si tiene un servidor que puede generar un volcado dinámico de ese tamaño, lo más probable es que tenga otro servidor que pueda procesar esa cantidad de volcado de almacenamiento dinámico.
¿Estás seguro de que el volcado no está dañado y de que estás utilizando una versión más reciente de los JAR DTFJ? Las características 'ArrayIndexOutOfBoundsException' en atleast [two] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=294311) [bugs] (https://bugs.eclipse.org/bugs/show_bug.cgi ? id = 307530). Estoy diciendo esto porque no has informado [un OOME al ejecutar MAT, que tiene una solución diferente] (http://wiki.eclipse.org/MemoryAnalyzer/FAQ#Out_of_Memory_Error_while_Running_the_Memory_Analyzer). –
jhat usa heapMap para almacenar los objetos leídos, que crece exponencialmente con la cantidad de objetos almacenados en el montón. Una opción es cambiar los decl's de heapMap a TreeMap, y ejecutar el tamaño de almacenamiento dinámico de jhat al menos tan grande como su proceso. – codeDr