¿Cómo analizo un archivo .hprof?

227

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?

Nick Stinemates
fuente

Respuestas:

215

Si desea una herramienta bastante avanzada para investigar seriamente, mire el proyecto Memory Analyzer en Eclipse, que SAP le proporcionó.

Algo de lo que puede hacer es increíblemente bueno para encontrar pérdidas de memoria, etc., incluida la ejecución de una forma de SQL limitado (OQL) contra los objetos en memoria, es decir

SELECCIONE toString (firstName) FROM com.yourcompany.somepackage.User

Totalmente brillante

Cowan
fuente
18
Solo me gustaría agregar un +100 para Eclipse Memory Analyzer. Actualmente estoy intentando filtrar a través de un archivo de volcado de almacenamiento dinámico de más de 400 MB, y me llevó más de 70 minutos leer el archivo, antes de que causara un bloqueo completo de JVM. EMA puede abrirlo en <5 minutos.
matt b
3
Sigo recibiendo errores de análisis al abrir archivos HPROF usando el Analizador de memoria Eclipse (que de hecho también fueron arrojados por Eclipse). Desafortunado ... suspiro.
lost_bits1110
3
MAT todavía puede requerir bastante RAM [menos que JHAT pero aún bastante]. Consulte stackoverflow.com/questions/7254017/… para obtener sugerencias si se encuentra con eso.
rogerdpack
71

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")

CMS
fuente
Después de ejecutar el comando anterior En la consola, recibirá el mensaje en la terminal "servidor está listo" Puerto: 7401. Después de eso, abra esta URL: localhost: 7401 "puede ver los detalles en las ventanas del navegador".
Laxman G
35

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.

James Schek
fuente
Debe agregar una nota de que esto es solo para Java 6 y 7.
Nick Stinemates
AFAIK, HeapWalker y VisualVM no requieren Java 6/7 para leer archivos HPROF.
James Schek
Intenté cargarlo con Java 5 y decía 'Por favor use Java 6 o 7' ¿Qué estoy haciendo mal?
Nick Stinemates
Hmm Quizás tenga que ejecutar Java 6, pero puede leer un HPROF de Java 5 (tal vez así es como lo hice funcionar). Sé que no puede crear un volcado de pila desde Visual VM en una aplicación que ejecute Java 5. Se actualizará.
James Schek
También puede usar JVM visual, desde Java SDK - busque jvisualvm.exeen la JAVASDK/bincarpeta
xxxvodnikxxx
11

Simplemente obtenga el analizador de memoria Eclipse . No hay nada mejor por ahí y es gratis.

JHAT solo se puede usar para "aplicaciones de juguetes"

kohlerm
fuente
3
JHAT es necesario para impresionar a los piratas informáticos "l33t" que construyen a mano una distribución BSD a partir de LILO. Espera ... nunca usarían java de todos modos. :-)
James Schek
Creo que esto es más un comentario ...: \
rogerdpack
10

YourKit Java Profiler parece manejarlos también.

estrella polar
fuente
5

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:

  • No crea ningún archivo temporal en el disco para procesar el volcado del montón
  • Puede trabajar directamente volcados de montón comprimido GZ
  • Notación HeapPath
Andrejs
fuente
2

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:

  1. Obteniendo un volcado de montón de OutOfMemoryError vamos a llamarlo "oome.hprof" Puede obtener esto a través del parámetro JVM HeapDumpOnOutOfMemoryError.
  2. Reinicie la aplicación, deje que se ejecute por mucho tiempo (minutos / horas) dependiendo de su aplicación. Obtenga otro volcado de almacenamiento dinámico mientras la aplicación aún se está ejecutando. Llamémoslo "healthy.hprof".
  3. Puede abrir estos dos volcados en VisualVM y hacer una comparación de volcado de montón. Puedes hacerlo a nivel de clase o paquete. Esto a menudo puede indicarle la dirección del problema.

enlace: https://visualvm.github.io

Waleed
fuente