2010-03-20 18 views
9

Hasta ahora he aprendido sobre la generación de volcado de hebras y el volcado de heap usando jstack y jmap respectivamente.Core dump equivalence para Java

Sin embargo, jstack dump dump contiene solo textos que describen la pila en cada hilo. Y al abrir el volcado del montón (archivo .hprof) con Java VisualVM solo se muestran los objetos asignados en el montón.

Lo que realmente quiero es poder ver la pila, cambiar a un marco de pila particular y observar las variables locales. Este tipo de depuración post mortem se puede hacer normalmente con herramientas como WinDbg, gdb y un archivo core (para un programa nativo de C++)

Me pregunto si ese archivo 'core' (que me permitirá depurar en no -live environment) existe en Java?

Respuesta

2

He encontrado información relevante en un Sun forum y en un SO discussion: No he tenido mucha suerte, pero podría funcionar en su caso.

Nota: algunas de las herramientas mencionadas son herramientas de Java, pero no son compatibles y no están disponibles en las versiones de Windows del JDK.

+0

Gracias. Creo que 'jsadebugd' es muy parecido a lo que estoy buscando. – Gant

1

No creo que exista un mecanismo de volcado de este tipo en Java estándar.

5

Java does. Si está utilizando una VM de IBM, use com.ibm.jvm.Dump.SystemDump() para generar un volcado programáticamente. Esto se puede depurar usando un depurador. Creo que "matar" tu proceso de Java también debería generar un vuelco del sistema. Para Unix, use kill -4 pid, donde pid es la identificación del proceso y se puede consultar escribiendo top | grep java si tiene 1 instancia de VM ejecutándose.

También puede añadir o -Xdump:system-Xdump:heap etc a la línea de comandos de Java para filtrar eventos y generar volcados en ciertos eventos como VM parada (-Xdump:system:events=vmstop), colecciones de basura completa (-Xdump:system:events=fullgc), etc. Nota, dependiendo de su tamaño de la pila, generar un volcado en un GC completo puede no ser una buena idea (es decir, puedes crear 50 volcados con 20 segundos si creces de 4M a alrededor de 60M en 20 segundos) para poder agregar un contador como -Xdump:system:events=fullgc,range=50..55 que generaría 5 núcleos entre la 50.a y la 55.a recolección de basura completa.

1

Algunos sistemas operativos (por ejemplo, Solaris mdb o gdb en Linux) admiten el uso del depurador nativo normal en archivos de volcado, con algún soporte especial para mostrar los marcos de pila de Java. Pero esto es bastante duro y probablemente no es lo que quieres, ya que no está bien integrado con Java Debugger.