Tengo un servidor de producción ejecutándose con el siguiente indicador: - XX: + HeapDumpOnOutOfMemoryError
Anoche generó un archivo java-38942.hprof cuando nuestro servidor encontró un error de montón. Resulta que los desarrolladores del sistema sabían de la bandera pero no hay forma de obtener información útil de ella.
¿Algunas ideas?
Puede usar JHAT , la herramienta de análisis de almacenamiento dinámico de Java que se proporciona de forma predeterminada con el JDK. Es la línea de comando pero inicia un servidor web / navegador que usa para examinar la memoria. No es el más fácil de usar, pero al menos ya está instalado en la mayoría de los lugares a los que irá. Una vista muy útil es el enlace "histograma de pila" en la parte inferior.
ex:
jhat -port 7401 -J-Xmx4G dump.hprof
jhat
puede ejecutar OQL "en estos días" también (enlace inferior "ejecutar OQL")fuente
También puede usar HeapWalker desde Netbeans Profiler o la herramienta independiente Visual VM . Visual VM es una buena alternativa a JHAT, ya que es independiente, pero es mucho más fácil de usar que JHAT.
Necesita Java 6+ para usar Visual VM por completo.
fuente
jvisualvm.exe
en laJAVASDK/bin
carpetaSimplemente obtenga el analizador de memoria Eclipse . No hay nada mejor por ahí y es gratis.
JHAT solo se puede usar para "aplicaciones de juguetes"
fuente
YourKit Java Profiler parece manejarlos también.
fuente
Si desea hacer un análisis personalizado de su heapdump, entonces hay:
Esta biblioteca es rápida pero necesitará escribir su código de análisis en Java.
De los documentos:
fuente
Personalmente prefiero VisualVM. Una de las características que me gustan en VisualVM es la comparación de volcado de montón. Cuando realiza un análisis de volcado de montón, hay varias formas de averiguar qué causó el bloqueo. Una de las formas que he encontrado útiles es hacer una comparación de los volcados de almacenamiento dinámico saludables contra los no saludables.
Los siguientes son los pasos que puede seguir para ello:
enlace: https://visualvm.github.io
fuente