generica - pilas en java eclipse
volcado de pila java en windows (7)
Además de la respuesta de Seth, también puede iniciar una JConsole en su máquina para inspeccionar el seguimiento de la pila de cada hilo. Esto tiene la ventaja adicional de poder detectar puntos muertos y monitorear el uso de la memoria.
Tengo un proceso java en ejecución en una ventana de comando estándar de Windows. es decir, he ejecutado ''cmd'' y escribí en java -jar ...
Necesito poder obtener un volcado de pila completo de todos los subprocesos si es posible.
Recuerdo que en Linux puede enviar un mensaje a la JVM a través de una opción en el comando Quit.
en este documento estado del sol
Para generar un seguimiento de la pila en las plataformas Windows 95 o Windows NT, ingrese la secuencia de teclas en la ventana donde se ejecuta el programa Java, o haga clic en el botón Cerrar en la ventana.
Esto es claramente incorrecto, ya que cerrar el terminal no hace más que detener el proceso y cerrar la ventana.
Echa un vistazo a este post de desbordamiento de pila
Volcado de subprocesos mediante programación / JDI (interfaz de depuración de Java)
Hemos implementado un método JMX para volcar seguimientos de pila. Esto es realmente útil porque puede examinar los rastros de pila en un navegador web incluso en una máquina remota.
En el 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 subprocesos.
Esto te da un volcado de hilo.
Una vez generado, puede A) Seleccionar todo: copiar y pegar el volcado de hilo en un editor de texto. o B) puede hacer clic derecho en el volcado de hilos 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 su posterior análisis.
Escribir Ctrl + Break es la forma correcta de generar un volcado de hilo en Windows.
¿Está presionando Ctrl + C (= interrupción) tal vez? Eso enviará un SIGINT, que generalmente matará su proceso.
Esto puede ayudarlo, pero también depende de qué versión de JVM y proveedor está utilizando.
http://java.sun.com/developer/technicalArticles/J2SE/monitoring/
http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html
http://java.sun.com/javase/6/docs/technotes/guides/visualvm/index.html
Otros carteles son correctos - ctrl-break en la consola o jstack.
De lo contrario, si está utilizando Java 1.5 o superior, puede obtener 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() )
luego iterar a través de los resultados.
Un poco 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();
}
Luego, puede elegir el método que desee para interceptar su programa para que esto suceda, y formatear / 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 subprocesos se hayan tomado 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.
Puede usar jstack [ option ] pid
(si la pregunta es sobre el volcado de hilos). Usa jps
para encontrar el id de tu proceso Java.