thread java debugging jstack

java - thread - jstack linux



Obteniendo el Id. De subproceso de Java y apilando traza de subproceso de Java en ejecuciĆ³n (5)

En mi instalación de producción más concurrida, en ocasiones obtengo un único hilo que parece atascarse en un ciclo infinito. No he logrado averiguar quién es el culpable, después de mucha investigación y depuración, pero parece que debería ser posible. Aquí están los detalles sangrientos:

Notas de depuración actuales:

1) ps -eL 18975 me muestra el pid de Linux el hilo hijo problemático, 19269

$ps -eL | grep 18975 ... PID LWP TTY TIME CMD 18975 18994 ? 00:00:05 java 18975 19268 ? 00:00:00 java 18975 19269 ? 05:16:49 java 18975 19271 ? 00:01:22 java 18975 19273 ? 00:00:00 java ...

2) jstack -l 18975 dice que no hay deadlocks, jstack -m 18975 no funciona

3) jstack -l 18975 me da el seguimiento de pila para todos mis hilos (~ 400). Ejemplo de pila de subprocesos ( y no el problema ):

"http-342.877.573.944-8080-360" daemon prio=10 tid=0x0000002adaba9c00 nid=0x754c in Object.wait() [0x00000000595bc000..0x00000000595bccb0] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at java.lang.Object.wait(Object.java:485) at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416) - locked (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:442) at java.lang.Thread.run(Thread.java:619)

4) La identificación de subproceso de la salida ps -eL no coincide con la salida de jstack, o al menos no puedo verlo. (La documentación de jstack es un poco escasa).

5) No hay IO pesado, uso de memoria u otras pistas de actividad correspondientes para trabajar.

Plataforma:

  • Java 6
  • Tomcat 6
  • RHEL 4 (64 bits)

¿Alguien sabe cómo puedo hacer esa conexión desde la salida de ps de Linux a mi problema con el hijo de Java? Tan cerca pero tan lejos...


Puede usar JConsole para ver el seguimiento de la pila del hilo.

Si usa JDK 1.6.0_07 o superior, también puede usar visualvm .

Ambas herramientas proporcionan una buena vista de todos los hilos en ejecución en una aplicación. La visualvm es bastante más agradable, pero con un poco de suerte ver todos los hilos puede ayudarlo a encontrar el hilo de la fuga.

Compruebe si hay hilos que están siempre en estado EN EJECUCIÓN. Cuando teníamos un hilo de run-away, el seguimiento de la pila cambiaba constantemente. Así que pudimos decir a qué métodos estaba llamando el bucle, y rastrear el bucle.


Desde la memoria, si realiza CTRL-BREAK en la consola, obtendrá un volcado de los hilos actuales y algunos de sus trazos de trama.

De la memoria (no estoy seguro de si esta es una función IntelliJ IDEa, o está predeterminada en java) pero le dirá qué hilo está bloqueado y qué objeto están esperando. Debería poder redirigir la salida a un archivo, y simplemente grep para el texto DEADLOCKED.

JConsole, VisualVM u otros perfiladores como JProfiler también te mostrarán los hilos y sus stacks; sin embargo, si no quieres usar ninguna herramienta externa, creo que CTRL-BREAK te dará lo que estás buscando.


Parece que el nid en la salida de jstack es la id de Linux LWP.

"http-342.877.573.944-8080-360" daemon prio=10 tid=0x0000002adaba9c00 nid=0x754c in Object.wait() [0x00000000595bc000..0x00000000595bccb0]

Convierte el nid a decimal y tienes la ID de LWP. En su caso 0x754c es 30028. Este proceso no se muestra en nuestra salida ps, pero probablemente fue uno de los LWP que ha omitido para ahorrar espacio.

Aquí hay un pequeño fragmento de Perl que puede usar para canalizar la salida de jstack a:

#!/usr/bin/perl -w while (<>) { if (/nid=(0x[[:xdigit:]]+)/) { $lwp = hex($1); s/nid=/lwp=$lwp nid=/; } print; }


El sol

Tenga en cuenta que prstat muestra de forma predeterminada el no de procesos ligeros, no el LWPID.

Para ver información sobre todos los procesos livianos para un usuario en particular, use la opción -L .

prstat -L -v -u weblogic

ahora usa el LWPID y conviértelo en hexadecimal y compáralo con el nid del volcado de la hebra


¡Buenas y útiles respuestas!

Para Linux, use ps -efL, la opción -L mostrará los LWP. Como nota al margen, el
"http-342.877.573.944-8080-360" daemon prio = 10 significa " ThreadName (según lo dado por la JVM)" runningmode (heredado de la prioridad pid) (heredado del pid)