En este artículo, le enseñaré cómo analizar la pila de hilos de JVM y cómo encontrar la causa raíz del problema de la información de la pila. En mi opinión, Thread Stack Analysis Technology es una tecnología que los ingenieros de soporte de productos Java EE deben dominar. La información almacenada en la pila de hilos suele estar mucho más allá de su imaginación.
Mi objetivo es compartir el conocimiento y la experiencia acumulados en el análisis de hilos en los últimos diez años. Estos conocimientos y experiencia se obtienen en el análisis en profundidad de varias versiones de JVM y los proveedores de JVM de varios fabricantes.
Entonces, ¿estás listo? Ahora este artículo se agrega al marcador. ¿Qué estás esperando? Date prisa y comparte este plan de capacitación de análisis de hilos con tus colegas y amigos.
Suena bien.
Mi sugerencia es seguirme para completar este plan de entrenamiento de análisis de hilos. Aquí están el contenido de capacitación que cubriremos. Al mismo tiempo, compartiré con ustedes los casos reales con los que he tratado para que todos aprendan y entiendan con todos.
1) Descripción general de pilas de hilos y conocimientos básicos
2) Principios y herramientas relacionadas de la pila de subprocesos
3) Diferentes formatos de pila de hilo JVM (punto de acceso Sun, IBM JRE, Oracal Jrockit)
4) Método de introducción y análisis del registro de pila de subprocesos
5) Análisis de pilas de hilos y tecnologías relacionadas
6) Plantillas de problemas comunes (enhebrado, cerraduras muertas, IO llamando a la muerte, reciclaje de basura/problema de memoryError, ciclo muerto, etc.)
7) Por ejemplo, análisis de problemas de pila de hilos
Espero que esta serie de capacitación le brinde ayuda verdadera, así que continúe prestando atención a la actualización de artículos semanales.
Pero, ¿qué debo hacer si tengo alguna pregunta en el proceso de estudio o no puedo entender el contenido en el artículo?
No te preocupes, solo trátame como tu mentor. Puede consultarme con cualquier pregunta sobre la pila de hilos (siempre que el problema no pueda ser demasiado bajo). Seleccione las siguientes formas de ponerse en contacto conmigo:
1) Comentado directamente en este artículo (si lo siente, puede ser anónimo)
2) Envíe los datos de su pila de subprocesos al foro de análisis de causa raíz
3) Envíame correo electrónico, la dirección es@[email protected]
¿Me puede ayudar a analizar los problemas encontrados en nuestros productos?
Por supuesto, si está dispuesto, puede enviarme sus datos de pila en vivo a través del foro de análisis de Capas de Mail o Forum Root. El problema real es el rey de aprender a mejorar las habilidades.
Realmente espero que a todos les pueda gustar este entrenamiento. Así que haré todo lo posible para proporcionarle materiales de alta calidad y responder sus diversas preguntas.
Antes de introducir la tecnología de análisis de pila de subprocesos y el modelo de problema, primero debe informarle el contenido básico. Entonces, en esta publicación, cubriré el contenido más básico, para que todos puedan comprender mejor la interacción entre los contenedores JVM, Middleware y Java EE.
Descripción general de Java VM
Java Virtual Machine es la base de la plataforma Jave EE. Es el lugar donde el middleware y las aplicaciones se implementan y se ejecutan.
JVM proporciona las siguientes cosas al software de middleware y su programa Java/Java EE:
(Formulario binario) Programa Java / Java EE Ejecutar el entorno algunas características y herramientas funcionales del programa (Infraestructura IO, estructura de datos, gestión de subprocesos, seguridad, monitoreo, etc.).).
Asignación y gestión de memoria dinámica con la ayuda de la recuperación de basura
Su JVM puede permanecer en muchos sistemas operativos (Solaris, AIX, Windows, etc.), y puede configurarse de acuerdo con su servidor físico.
Interacción entre JVM y middleware
El siguiente diagrama muestra el modelo interactivo de alta elevación entre JVM, middleware y aplicaciones.
Algunas interacciones simples y típicas entre el JVM, el middleware y las aplicaciones que se muestran en la figura. Como puede ver, la asignación de los hilos de la aplicación estándar de Java EE se completa entre el núcleo de la parte media y JVM. (Por supuesto, hay excepciones. La aplicación puede llamar directamente a la API para crear un hilo. Este enfoque no es común y es necesario tener cuidado durante el uso)
Al mismo tiempo, tenga en cuenta que algunos hilos son manejados por JVM.
Debido a que la mayor distribución de hilos es realizada por el contenedor Java EE, es importante comprender y comprender el seguimiento de la pila de subprocesos, y puede identificarla a partir de los datos de la pila de subprocesos, lo cual es importante para usted. Las solicitudes están a punto de ejecutar el contenedor Java EE.
Desde la perspectiva del análisis de una pila de almacenamiento de subprocesos, podrá comprender la diferencia entre el grupo de subprocesos descubierto de JVM e identificar el tipo de solicitud.
La última sección le proporcionará una descripción general de la pila de subprocesos JVM para HotSop V proporcionarle.
Tenga en cuenta que puede obtener un ejemplo de pila de subprocesos para este artículo de las razones fundamentales.
JVM PISTA DE SUMPLACIÓN -¿Qué es?
La pila de hilos JVM es una instantánea de tiempo determinada que puede proporcionarle una lista completa de todos los hilos Java creados.
Cada hilo de Java encontrado le dará la siguiente información:
El nombre del hilo;
Tipo de hilo y prioridad, por ejemplo: Daemon Prio = 3 ** El programa de middleware generalmente crea sus hilos en forma de tutera de fondo, lo que significa que estos hilos se ejecutan en segundo plano; A su aplicación Java EE **
ID de hilo Java, como: tid = 0x000000011e52a800 ** Esta es la ID de hilo Java obtenida a través de java.lang.thread.getID ().
ID de hilo nativo, como: NID = 0x251c **, la clave es porque la ID de subproceso nativa le permite obtener desde la perspectiva del sistema operativo.
Estado del hilo de Java e información detallada, tales como: esperar la entrada del monitor [0xffffffffea5afb000] java.lang.thread.state: block (en el monitor de objetos)
** Puede comprender rápidamente la posible razón por la cual el estado del hilo está extremadamente actualmente bloqueado **
El seguimiento de la pila de Java; Causa de muchos tipos de problemas, el 90%de la información requerida.
La descomposición de la memoria de la pila Java; Esta información es muy útil al analizar los problemas causados por GCS frecuentes. Puede usar los datos o el modo de subprocesos conocidos para hacer un posicionamiento rápido.
HEAPPSYNGGEN Total 466944k, utilizado 178734K [0xffffffffff45c00000, 0xffffffff70800000, 0xfffffffff70800000) ffffffffff62400000, 0xfffffff62400000,0xfffffff70800000) E 233472k, 0% userd [0xffffffff540000, 0xffffff5400000000 , 0xfffffffff62400000) Psoldgen Total 1400832k, usado 1400831k [0xfffffffffffef0400000, 0xfffffffff45c00000, 0xffffffff45c00000) objeto 1400832k, 99% usado [0xffffffffffffef0000, 00000) PSPermgen Total 262144k, usado 248475k, 0xffffffee0400000, 0xffffffffff0400000) espacio de objeto 262144k, 94 % usado [0xfffffffed0400000 , 0xffffffedf6f08,0xffffffffffee0400000)
Gran desmontaje de la información de la pila de hilos
Para permitir que todos entiendan mejor, se proporciona la siguiente imagen a todos.
En la figura anterior, se puede ver que la pila de subprocesos está compuesta de múltiples partes diferentes. Esta información es importante para el análisis del problema, pero el análisis del modo de diferentes problemas usará diferentes partes (el modo de problema simulará y demostrará en los artículos posteriores).
Ahora, a través de este ejemplo de análisis, explicaré en detalle los componentes de la información de la pila Hotespot on -Things:
# Volcado de hilo completo
"Full Thread Dump" es una palabra clave global. Este es el comienzo de la instantánea de la pila de subprocesos.
Subtspot Java de hilo completo (TM) VM de 64 bits VM (modo mixto 20.0-B11):
# Java EE Middleware, terceros e hilos en software de aplicaciones personalizadas
Esta parte es la parte central de toda la pila de hilos, y también es la parte que generalmente necesita analizar el tiempo. El número de líneas medias de la pila depende del middleware que use, una tercera biblioteca parcial (puede tener hilos independientes) y su aplicación (si crea un hilo personalizado, esto generalmente no es una buena práctica).
En nuestra pila de hilos de ejemplo, WebLogic es el middleware que usamos. A partir de WebLogic 9.2, utilizará el grupo de hilos único que puede administrar "por"
"[Standby] Ejecuthread: '414' para la cola: 'weblogic.kernel.default (auto-tune)'" Daemon prio = 3 tid = 0x000000010916a800 nid = 0x2613 en object .wait () [0xffffffffffe9edff000] java.lang.thread. Estado: Waiting (en el monitor de objetos) en java.lang.object.wait (método nativo) -laiting en <0xffffff27d44de0> (un weblogic.work.executetethread). Work.Work.cutethread.WaitForRequest (ejecutethread.java:160) -Locked <0xfffffffffff27d44de0> (un weblogic.work.executetethread) c.work.executethread.run (ejecutethread.Java:181)
# Hilo VM de hotspot
Este es un hilo interno administrado por Hotspot VM para la operación nativa de operaciones internas. En general, no tiene que hacer demasiado sobre esto, a menos que encuentre una alta tasa de ocupación de la CPU a menos que usted (a través de pilas de hilos relacionadas y PRSTAT o ID de subproceso nativo).
"VM Task Hilo periódico" prio = 3 tid = 0x0000000101238800 nid = 0x19 esperando en condición
# Hilo de hotspot gc
Cuando se usa HotSpot para GC paralelo (ahora es común en el entorno de múltiples núcleos físicos), cuando la VM de Hotspot creada por defecto, o cada JVM administra un hilo de GC con un logotipo específico. La limpieza periódica de GC causará la reducción general del tiempo de GC;
"GC Task Task Thread#0 (ParallElGC)" prio = 3 tid = 0x0000000100120000 nid = 0x3 runnable "GC Task Hilo#1 (parallelgc)" prio = 3 tid = 0x0000131000 nid = 0x444 runnable ……………………… ………………………………………… ………………………………………………………………………………………… …………………………………………………………………
Estos son datos críticos, porque cuando encuentre problemas relacionados con GC, como GC excesivo y fugas de memoria, podrá usar el sistema operativo o el hilo de Java asociado con el valor de ID nativo de estos subprocesos, y luego encontrar cualquier correcto Correcto.
# JNI Recuento de referencia global
La referencia global de JNI (interfaz local de Java) es del código local al objeto básico del objeto Java administrado por el colector de basura Java. Recolección de basura.
Al mismo tiempo, también es importante prestar atención a las referencias de JNI para detectar fugas relacionadas con JNI, si su programa usa JNI directamente, o una tercera herramienta parcial como un oyente, causará fácilmente fugas de memoria local.
JNI Referencias globales: 1925
# Vista de uso de Java Stack
Estos datos se han agregado a JDK 1.6, proporcionando una vista corta y rápida de la pila de puntos de acceso. Y la pila Java en una instantánea separada, para que pueda analizar (o excluir) en un espacio específico de memoria de la pila Java en ese momento.
Heap PSYOUNGGEN Total 466944k, utilizado 178734K [0xffffff45c00000, 0xffffffff70800000, 0xffffffffff70800000) ffffffff62400000, 0xfffffff62400000,0xffffffff70800000) E 233472k, 0% usado [0xfffffffff54000000, 0xffffffff540000, 0xffffffff62400000) Psoldgen Total 1400832k, usado 1400831K [0xffffffef0400000, 0xfffffffffffffffff, 0xfffffffffffffffffffffffffi ff45c00000) Ffffffff45bffffb8,0xffffffff45c00000) Pspermgen Total 262144k, usado 248475k [0 xffffffffffed0400000, 0xffffffffffee0400000, 0xffffffffffef0400000) 94% usado [0xfffffffffed0400000,0xffffffff6a6f08,0xfffffffffee040000