2010-01-23 13 views
22

Tengo un proceso en ejecución de Java en una ventana de comandos de Windows estándar. es decir, he funcionado 'cmd' y escrito en java-jar ...volcado de la pila de Java en Windows

tengo que ser capaz de obtener un volcado de pila completa de todas las discusiones, si es posible.

Recuerdo que en Linux se puede enviar un mensaje a la JVM a través de una opción en el comando quit.

en this document estado sol

Para generar un seguimiento de pila en Windows 95 o plataformas Windows NT, introduzca la secuencia de teclas en la ventana donde el programa Java es correr, o haga clic en el Cerrar botón en la ventana.

esto es claramente incorrecto, ya que cerrar el terminal no hace más que matar el proceso y cerrar la ventana.

Respuesta

18

Typing Ctrl +rotura es la forma correcta de generar un volcado de procesos en Windows.

¿Está presionando Ctrl +C (= interrupción) tal vez? Eso enviará un SIGINT, que generalmente matará su proceso.

35

Puede utilizar jstack [ option ] pid (si la pregunta es sobre volcado de hilos). Use jps para encontrar la identificación de su proceso de Java.

+0

Si no tiene una ventana de consola de su proceso de Java, entonces esto funciona para obtener el volcado de subprocesos en Windows. – ssasa

1

Además de la respuesta de Seth, también se puede poner en marcha un JConsole en su máquina con el fin de inspeccionar seguimiento de la pila de cada hilo. Esto tiene la ventaja adicional de ser capaz de detectar interbloqueos y monitorear el uso de la memoria.

1

Otros carteles son correctos - ctrl-break en la consola o jstack.

De lo contrario, si usted está usando Java 1.5 o superior, puede hacerse con esta información mediante programación en tiempo de ejecución, a través de:

Thread.getAllStackTraces() (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#getAllStackTraces())

continuación, iterar a través de los resultados.

Un poco de largo aliento, pero algo como esto:

Map<Thread,StackTraceElement[]> traces = Thread.getAllStackTraces(); 
Iterator<Thread> i = traces.keySet().iterator(); 
while (i.hasNext()) { 
    Thread thd = i.next(); 
    System.out.println("*** Thread id"+thd.getId()+":"+thd.getName()+" ***"); 
    StackTraceElement[] trace = traces.get(thd); 
    for (int j=0; j < trace.length; ++j) { 
     System.out.println(trace[j]); 
    } 
    System.out.println(); 
} 

A continuación, puede elegir cualquier método que desea atrapar a su programa para hacer que esto suceda, y el formato/dirigir la salida.

Una desventaja de este método es que no es exacto, ya que no se garantiza que las pilas de los diferentes hilos hayan sido tomadas exactamente al mismo tiempo. Sin embargo, hay una ventaja de rendimiento asociada en que su proceso completo no se suspenderá mientras se toma la instantánea.

5

En Java 6 JDK + el ejecutable jvisualvm le permite adjuntar a un programa en ejecución (haga doble clic en su entrada en el lado izquierdo).

Cuando está conectado, hay un panel de Subprocesos en el lado derecho, que tiene un botón de Volcado de Subproceso.

Esto le da un vuelco de hilo.

Una vez generado, puede A) Seleccionar todo: copie y pegue el volcado de hilo en un editor de texto. o B) puede hacer clic con el botón derecho en el volcado de hilo creado en el árbol en el lado izquierdo y decir "Guardar como".

Notas jvisualvm también le permite tomar instantáneas de toda la aplicación para análisis posteriores.

Cuestiones relacionadas