Cómo contar el estado del hilo en los registros de jstack
estado del hilo jstack
Los estados del hilo que merecen atención en el hilo jstack son:
Estado muerto , Dead Lock (enfoque)
Ejecutando. Ejecutable
Esperando recursos
en condición (enfoque)
Esperando obtener monitor
en la entrada del monitor (enfoque)
Suspended (suspendido)
Objeto.Esperando en, Objeto.
o TIMED_WAITING
Bloqueado, Bloqueado (enfoque)
Detenido, estacionado
A continuación, comenzaremos con el primer ejemplo, luego enumeraremos los significados y precauciones de los diferentes estados del hilo y finalmente agregaremos dos ejemplos.
Demostración completa 1: Espera
Bloqueo y bloqueo
El ejemplo es el siguiente:
"Conexión RMI TCP (267865)- 172.16.5.25 " daemon prio=10 tid= 0x00007fd508371000 nid=0x55ae esperando
entrada de monitor [0x00007fd4f8684000]
java.lang.Thread.State: BLOQUEADO
(en el monitor de objetos)
en org.apache.log4j.Category.callAppenders(Category.java:201)
- esperando
para bloquear <0x00000000acf4d0c0> (a org.apache.log4j.Logger)
en org.apache.log4j.Category.forcedLog(Category.java:388)
en org.apache.log4j .Category log(log4j.Category.log( Category.java:853)
en org.apache.commons.logging.impl.Log4JLogger.warn(Log4JLogger.java:234)
en com.tuan.core.common.lang.cache.remote.SpyMemcachedClient.get(SpyMemcachedClient.java:110)
......
1) El El estado del hilo está bloqueado. ¡Esto significa que se agotó el tiempo de espera del hilo que esperaba el recurso!
2) "esperando bloquear <0x00000000acf4d0c0>" significa que el hilo está esperando bloquear la dirección 0x00000000acf4d0c0 (se puede describir como: intentando
obtener el bloqueo 0x00000000acf4d0c0).
3) Busque la cadena 0x00000000acf4d0c0 en el registro de volcado y descubra que una gran cantidad de subprocesos están esperando para bloquear la dirección. Si puede averiguar en los registros quién obtuvo el bloqueo (por ejemplo, bloqueo < 0x00000000acf4d0c0 >), puede seguir el ejemplo.
4) "Esperando entrada del monitor" significa que el hilo ha solicitado acceso a la sección crítica a través de sincronizado(obj) {......}, ingresando así la "Entrada
Establecer "cola", pero el monitor correspondiente a obj es propiedad de otro hilo, por lo que este hilo está esperando en la cola "Entry Set".
5) En la primera línea, "RMI TCP Connection(267865)-172.16.5.25" es el nombre del hilo, tid es el ID del hilo de Java, nid es el ID del hilo local y prio es el hilo. prioridad. [0x00007fd4f8684000] es la dirección inicial de la pila de subprocesos.
El significado y los comentarios del estado del hilo en el archivo de volcado
El significado es el siguiente:
Estado muerto: hilo muerto, generalmente se refiere a la relación entre múltiples Se llaman subprocesos y entran en un estado de ocupación mutua de recursos, lo que da como resultado una situación en la que siempre están esperando su liberación.
Ejecutable: generalmente se refiere al estado en el que se ejecuta un subproceso. El subproceso ocupa recursos, está procesando una solicitud, puede estar pasando SQL a la base de datos para su ejecución, puede estar operando en archivos y puede estar. realizando el procesamiento del tipo de datos. Espere la conversión.
Esperando condiciones: Esperando que se produzcan recursos o condiciones. Los motivos específicos deben analizarse junto con el seguimiento de la pila
.
Una situación es que la red está muy ocupada, ocupa casi todo el ancho de banda y todavía hay muchos datos esperando ser leídos y escritos en la red.
Otra situación; Puede ser que la red esté en estado inactivo, pero los paquetes no llegan correctamente debido al enrutamiento y otros problemas.
Si la información de la pila es claramente código de aplicación, demuestra que el hilo está esperando un recurso. La situación habitual es que si un recurso se lee en grandes cantidades y el recurso utiliza un bloqueo de recursos, el hilo entrará en un estado de espera, esperando que se lea el recurso.
O está esperando que se ejecute otro hilo, etc.
Si observa una gran cantidad de subprocesos esperando lecturas y escrituras de red en la pila de subprocesos, esto puede ser una señal de un cuello de botella en la red. Esto se debe a que la red bloquea la ejecución del hilo.
Otro estado de espera común es cuando el hilo está inactivo y se despertará una vez finalizado el tiempo de inactividad.
Bloqueo: cuando el subproceso actual espera un recurso requerido durante mucho tiempo pero no puede obtener el recurso y el administrador de subprocesos del contenedor lo marca como bloqueado, el subproceso se bloqueará. Se agotó el tiempo de espera del hilo mientras esperaba un recurso.
Esperando la entrada del monitor en Object.wait(): el monitor es el medio principal en Java para lograr la exclusión mutua y la cooperación entre subprocesos. Puede considerarse como un bloqueo en un objeto o clase. Como se muestra en la Figura 1 a continuación, cada monitor solo puede ser propiedad de un hilo (el "hilo activo") en un momento dado, mientras que todos los demás hilos son "hilos en espera", divididos en dos colas (el "conjunto de entrada" y la cola de espera). en el "conjunto de espera").
El estado del hilo en espera en "Conjunto de entrada" es "Esperando entrada de monitor", y el estado del hilo en espera en "Conjunto de espera" es
"en Objeto. esperar()".
Figura 1 Java Monitor
Demostración integral 2: espera
en condición y TIMED_WAITING
Los ejemplos son los siguientes:
Demonio "Conexión TCP RMI (inactivo)" prio=10 tid=0x00007fd50834e800 nid=0x56b2 esperando
en condición [0x00007fd4f1a59000]
java.lang.Thread.State.TIMED_WAITING (Apagar): TIMED_WAITING (Apagar)
en sun.misc.Unsafe.park(Método nativo)
- Dejar de esperar <0x00000000acd84deg8> (a
java.util.concurrent.SynchronousQueue$TransferStack)
en java.util.concurrent.locks(Método nativo)
. java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
en java.util.concurrent.SynchronousQueue$ TransferStack.awaitFulfill(SynchronousQueue.java:424)
en java.util.concurrent.TransferStack.transfer(SynchronousQueue.java:424)