Hablemos de un volcado de flujo y cómo analizarlo.
También discutiremos cómo ayuda a identificar problemas y algunos analizadores que puede usar.
- ¿Qué es un hilo?
- Volcado de hilo
- Volcado de flujo en Java
- Generando volcados de hilo
- #1. chstack
- En Windows
- En Linux
- № 2. jVisualvm
- #3. JCMD
- № 4. JCMD
- № 5. jconsole
- № 6. ThreadmxBean
- Análisis manual de volcados de hilos
- Análisis de hilos bloqueados
- Analizar un hilo bloqueado
- Analizadores de volcados de flujo
- №1. Hilo rápido
- № 2. Analizador de volcado de flujo de Spotify
- №3. Descripción general de Jstack
- № 4. Sitio 24 × 7.
- №1. Jprofiler
- № 2. IBM TMDA
- №3. Mantenimiento de el motor
- № 4. Tu kit
- Conclusión
¿Qué es un hilo?
Un proceso es un programa de computadora que se carga en la memoria de la computadora y está en proceso de ejecutarse. Puede ser ejecutado por un procesador o un conjunto de procesadores. Se describe un proceso en la memoria con información importante como tiendas variables, descriptores de archivos, contador de instrucciones, registros, señales, etc.
Un proceso puede consistir en muchos procesos livianos llamados hilos. Ayuda a lograr el paralelismo cuando un proceso se divide en múltiples hilos. Esto lleva a un mejor rendimiento. Todos los hilos dentro de un proceso comparten el mismo espacio de memoria y dependen unos de otros.
Volcado de hilo
Cuando se ejecuta un proceso, podemos determinar el estado de ejecución actual de los subprocesos en el proceso utilizando volcados de subprocesos. Un volcado de subprocesos contiene una instantánea de todos los hilos activos en un momento particular de ejecución del programa. Contiene toda la información necesaria sobre el hilo y su estado actual.
Una aplicación moderna hoy incluye varios hilos. Cada hilo requiere ciertos recursos, realiza ciertas acciones relacionadas con el proceso. Esto puede mejorar el rendimiento de la aplicación porque los hilos pueden utilizar los núcleos de CPU disponibles.
Pero hay compensaciones, por ejemplo, a veces múltiples hilos pueden no coordinar bien entre sí y puede ocurrir un punto muerto. Entonces, si algo sale mal, podemos usar volcados de subprocesos para verificar el estado de nuestros hilos.
Volcado de flujo en Java
Un volcado de hilo JVM es una lista del estado de todos los hilos que forman parte de un proceso en ese momento particular. Contiene información sobre la pila de subprocesos, representada como un rastro de pila. Dado que está escrito en texto plano, su contenido se puede guardar para ver. Analizar los vertederos de hilos puede ayudar en
- Optimización de rendimiento de JVM
- Optimización del rendimiento de la aplicación
- Diagnóstico de problemas como enclavamientos, conflictos de hilos, etc.
Generando volcados de hilo
Hay muchas maneras de crear volcados de subprocesos. A continuación se muestran algunas herramientas basadas en JVM que se pueden ejecutar desde la línea de comando /terminal (herramientas CLI) o el directorio /bin (herramientas GUI) de la carpeta de instalación de Java
Exploremoslos.
#1. chstack
La forma más fácil de crear un volcado de transmisión es usar jstack. El Jstack viene con el JVM y se puede usar desde la línea de comando. Aquí necesitamos el PID del proceso para el que queremos generar un volcado de flujo. Para obtener el PID, podemos usar el comando JPS como se muestra a continuación.
El JPS enumera todas las ID de proceso de los procesos Java.
En Windows
C:Program FilesJavajdk1.8.0_171bin>jps -l 47172 portal 6120 sun.tools.jps.Jps C:Program FilesJavajdk1.8.0_171bin>
En Linux
[[Correo electrónico protegido]~]# jp s-l 1088 /opt/keycloak/jboss-modules. jar 26680 /var/lib/jenkins/workspace/kyc/kyc/target/kyc-1. 0. jar 7193 jdk. jcmd/sun. tools. jps. jps 2058 /usr/share/jenkins/jenkins. war 11933 /var/lib/jenkins/workspace/admin-portal/target/portal-1. 0. jar [[correo electrónico protegido]~]#
Como podemos ver aquí, obtenemos una lista de todos los procesos Java en ejecución. Contiene la ID de máquina virtual local para el proceso Java en ejecución y el nombre de la aplicación en las columnas uno y dos respectivamente. Ahora, para generar un volcado de subprocesos, usamos el programa JSTACK con el indicado r-L, que crea una larga salida de volcado. También podemos dirigir la salida a algún archivo de texto de nuestra elección.
[[Correo electrónico protegido]~] # jstac k-l 26680 2020-06-27 06:04:53 Volcado de hilo completo Java Hotspot (TM) VM de 64 bits (25. 221-B11 Modo mixto): "Adjunte el oyente" # 16287 Daemon Prio = 9 OS_PRIO = 0tid = 0x00007f0814001800 nid = 0x4ff2 esperando en condición [0x000000000000000000] java. lang. thread. state: runnable bloqueado sincronizadores propios: sincronizadores: ninguno "logbac k-8" #2316 DAEMON PRIO = 5 OS_PRIO = 0 TID = 0X007F07E00333000 NID = 0x44792[0x00007F07BAFF8000] java. lang. thread. state: Waiting (парковка) en Sun. misc. unsafe. park (método nativo) - парковка дòли sabor (a java. util. concurrent. llocks. abstractqueedstronizer $ ° AT JAVAOL. concurrent. locks. locksupport. park (Locksupport. java:175) en java. util. concurrent. locks. AbstractqueedSynChronizer $ condicionObject. AWAIT (abstractQueueDynChronizer. java:2039) en java. util. concurrent. scheduledThreadPoolExecutor $ demandada de trabajoTake (ProchuledThreadPoolExecutor. java:809) en java. util. concurrent. threadpoolexecutor. getTask (threadpoolexecutor. java:1074) en java. util. concurrent. threadpoolexili oolexecutor$ Trabajador. run (threadpoolexecutor. java:624) en java. lang. thread. run (hilden condición [0x00007f07bb0f9000] java. lang. thread. state: Waiting (парковка)
№ 2. jVisualvm
JVISUALVM es una herramienta de GUI que nos ayuda a solucionar problemas, monitor y perfil de aplicaciones Java. También viene con JVM y se puede ejecutar desde el directorio /bin de nuestra instalación de Java. Es muy intuitivo y fácil de usar. Entre otras opciones, también nos permite capturar un volcado de flujo para un proceso en particular.
Para ver el volcado de flujo para un proceso en particular, podemos hacer clic derecho en el programa y seleccionar «volcado de flujo» en el menú contextual.
#3. JCMD
JCMD es una utilidad de línea de comando que viene con el JDK y se utiliza para enviar solicitudes de comando de diagnóstico al JVM.
Sin embargo, solo funciona en la computadora local que ejecuta la aplicación Java. Se puede utilizar para administrar registros de vuelo Java, diagnosticar y solucionar problemas de aplicaciones JVM y Java. Podemos usar el comando JCMD Thread. print para obtener una lista de volcados de subprocesos para un proceso particular especificado por el PID.
A continuación se muestra un ejemplo de cómo podemos usar JCMD.
JCMD 28036 hilo.
C:Program FilesJavajdk1.8.0_171bin>jcmd 28036 Thread.print 28036: 2020-06-27 21:20:02 Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.171-b11 mixed mode): "Bundle File Closer" #14 daemon prio=5 os_prio=0 tid=0x0000000021d1c000 nid=0x1d4c in Object.wait() [0x00000000244ef000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Unknown Source) at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.getNextEvent(EventManager.java:403) - locked (a org.eclipse.osgi.framework.eventmgr.EventManager$EventThread) at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:339) "Active Thread: Equinox Container: 0b6cc851-96cd-46de-a92b-253c7f7671b9" #12 prio=5 os_prio=0 tid=0x0000000022e61800 nid=0xbff4 waiting on condition [0x00000000243ee000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) "Service Thread" #10 daemon prio=9 os_prio=0 tid=0x0000000021a7b000 nid=0x2184 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C1 CompilerThread3" #9 daemon prio=9 os_prio=2 tid=0x00000000219f5000 nid=0x1300 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread2" #8 daemon prio=9 os_prio=2 tid=0x00000000219e0000 nid=0x48f4 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread1" #7 daemon prio=9 os_prio=2 tid=0x00000000219df000 nid=0xb314 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x00000000219db800 nid=0x2260 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x00000000219d9000 nid=0x125c waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x00000000219d8000 nid=0x834 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000000001faf3000 nid=0x36c0 in Object.wait() [0x0000000021eae000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(Unknown Source) - locked (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(Unknown Source) at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source) "Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x0000000005806000 nid=0x13c0 in Object.wait() [0x00000000219af000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Unknown Source) at java.lang.ref.Reference.tryHandlePending(Unknown Source) - locked (a java.lang.ref.Reference$Lock) at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source) "main" #1 prio=5 os_prio=0 tid=0x000000000570e800 nid=0xbf8 runnable [0x0000000000fec000] java.lang.Thread.State: RUNNABLE at java.util.zip.ZipFile.open(Native Method) at java.util.zip.ZipFile.(Unknown Source) at java.util.zip.ZipFile.(Unknown Source) at java.util.zip.ZipFile.(Unknown Source) at org.eclipse.osgi.framework.util.SecureAction.getZipFile(SecureAction.java:307) at org.eclipse.osgi.storage.bundlefile.ZipBundleFile.getZipFile(ZipBundleFile.java:136) at org.eclipse.osgi.storage.bundlefile.ZipBundleFile.lockOpen(ZipBundleFile.java:83) at org.eclipse.osgi.storage.bundlefile.ZipBundleFile.getEntry(ZipBundleFile.java:290) at org.eclipse.equinox.weaving.hooks.WeavingBundleFile.getEntry(WeavingBundleFile.java:65) at org.eclipse.osgi.storage.bundlefile.BundleFileWrapper.getEntry(BundleFileWrapper.java:55) at org.eclipse.osgi.storage.BundleInfo$Generation.getRawHeaders(BundleInfo.java:130) - locked (a java.lang.Object) at org.eclipse.osgi.storage.BundleInfo$CachedManifest.get(BundleInfo.java:599) at org.eclipse.osgi.storage.BundleInfo$CachedManifest.get(BundleInfo.java:1) at org.eclipse.equinox.weaving.hooks.SupplementerRegistry.addSupplementer(SupplementerRegistry.java:172) at org.eclipse.equinox.weaving.hooks.WeavingHook.initialize(WeavingHook.java:138) at org.eclipse.equinox.weaving.hooks.WeavingHook.start(WeavingHook.java:208) at org.eclipse.osgi.storage.FrameworkExtensionInstaller.startActivator(FrameworkExtensionInstaller.java:261) at org.eclipse.osgi.storage.FrameworkExtensionInstaller.startExtensionActivators(FrameworkExtensionInstaller.java:198) at org.eclipse.osgi.internal.framework.SystemBundleActivator.start(SystemBundleActivator.java:112) at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:815) at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) at java.security.AccessController.doPrivileged(Native Method) at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:808) at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:765) at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:1005) at org.eclipse.osgi.internal.framework.EquinoxBundle$SystemBundle$EquinoxSystemModule.initWorker(EquinoxBundle.java:190) at org.eclipse.osgi.container.SystemModule.init(SystemModule.java:99) at org.eclipse.osgi.internal.framework.EquinoxBundle$SystemBundle.init(EquinoxBundle.java:272) at org.eclipse.osgi.internal.framework.EquinoxBundle$SystemBundle.init(EquinoxBundle.java:257) at org.eclipse.osgi.launch.Equinox.init(Equinox.java:171) at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:316) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:251) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:661) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:597) at org.eclipse.equinox.launcher.Main.run(Main.java:1476) "VM Thread" os_prio=2 tid=0x000000001fae8800 nid=0x32cc runnable "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000005727800 nid=0x3264 runnable "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000005729000 nid=0xbdf4 runnable "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000000000572a800 nid=0xae6c runnable "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000000000572d000 nid=0x588 runnable "GC task thread#4 (ParallelGC)" os_prio=0 tid=0x000000000572f000 nid=0xac0 runnable "GC task thread#5 (ParallelGC)" os_prio=0 tid=0x0000000005730800 nid=0x380 runnable "GC task thread#6 (ParallelGC)" os_prio=0 tid=0x0000000005733800 nid=0x216c runnable "GC task thread#7 (ParallelGC)" os_prio=0 tid=0x0000000005734800 nid=0xb930 runnable "VM Periodic Task Thread" os_prio=2 tid=0x0000000021a8d000 nid=0x2dcc waiting on condition JNI global references: 14 C:Program FilesJavajdk1.8.0_171bin>
№ 4. JCMD
JMC significa Java Mission Control. Es una herramienta GUI de código abierto que viene con el JDK y se utiliza para recopilar y analizar los datos de la aplicación Java.
Se puede ejecutar desde la carpeta /bin de nuestra instalación de Java. Los administradores y desarrolladores de Java usan esta herramienta para recopilar información detallada de bajo nivel sobre el comportamiento de JVM y la aplicación. Proporciona un análisis detallado y eficiente de los datos recopilados por Java Flight Recorder.
Cuando lanzamos JMC, vemos una lista de procesos Java que se ejecutan en la máquina local. La conexión remota también es posible. En un proceso en particular, podemos hacer clic con el botón derecho y seleccionar «Inicie la grabadora de vuelo» y luego verificar los volcados de flujo en la pestaña «Streams».
№ 5. jconsole
El JConsole es una herramienta de extensión de gestión de Java utilizada para la gestión y monitoreo de quejas.
También tiene un conjunto de operaciones de agente JMX predefinidas que el usuario puede realizar. Permite al usuario detectar y analizar el rastro de la pila de un programa en ejecución. Se puede ejecutar desde la carpeta /bin de nuestra instalación de Java.
Usando la herramienta JConsole GUI, podemos verificar el rastro de la pila de cada hilo cuando lo conectamos a un proceso Java en ejecución. Luego, en la pestaña del hilo, podemos ver el nombre de todos los hilos en ejecución. Para detectar el enclavamiento, podemos hacer clic en «detectar el enclavamiento» en la esquina inferior derecha de la ventana. Si se detecta el enclavamiento, aparecerá en una nueva pestaña, de lo contrario, se mostrará «no se detectará el enclavamiento».
№ 6. ThreadmxBean
ThreadMxBean es una interfaz para administrar el sistema de subproces de Java Virtual Machine que pertenece al paquete Java. Lang. Management. Se utiliza principalmente para detectar hilos que han entrado en una situación entrelazada y obtener información detallada sobre ellos.
Podemos usar la interfaz ThreadMXBean para capturar el volcado de hilo mediante programación. El método getThreadMxBean () del objeto administrador de Management se utiliza para obtener una instancia de la interfaz ThreadMXBean. Devuelve el número de hilos vivos de hilos de demonio y no damon. ManagementFactory es una clase de fábrica para obtener componentes administrados para la plataforma Java.
Cadena estática privada GetThreadDump (Boolean Lockmonitors, Boolean Locksynchronizers)< StringBuffer threadDump = new StringBuffer (System.lineSeparator ()); ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean (); for (ThreadInfo threadInfo : threadMXBean.dumpAllThreads (lockMonitors, lockSynchronizers)) < threadDump.append (threadInfo.toString ()); >return threadDump.toString (); >
Análisis manual de volcados de hilos
El análisis de los volcados de subprocesos puede ser muy útil para detectar problemas en procesos multiproceso. Se pueden resolver problemas como bloqueos mutuos, conflictos entre cerraduras y uso excesivo de la CPU por vertederos de roscas individuales visualizando los estados de los volcados de roscas individuales.
El máximo rendimiento de la aplicación se puede lograr fijando el estado de cada hilo después de analizar el volcado de subprocesos.
Por ejemplo, suponga que un proceso usa muchas CPU, podemos averiguar si algún hilo está utilizando la mayor cantidad de CPU. Si existe dicho hilo, convertimos su número LWP en un número hexadecimal. Luego, desde el volcado de hilo, podemos encontrar un hilo con un NID igual al número hexadecimal obtenido previamente. Usando el rastro de la pila de subprocesos, podemos identificar el problema. Averigamos el ID de proceso del hilo utilizando el siguiente comando.
P S-MO PID, LWP, Time, Time, CP U-C Java
[[Correo electrónico protegido]~]# P S-mo Pid, LWP, Time, Time, CP U-C Java Pid Lwp Time Time %CPU 26680 - Dec07 00:02:02 99. 5 - 10039 Dec07 00:00:00 0. 1 - 10040 Dec07 00:00 95. 5
Echemos un vistazo al fragmento de volcado de flujo a continuación. Para obtener el volcado de flujo para el proceso 26680, use jstac k-l 26680
[[Correo electrónico protegido]~] # JSTAC K-L 26680 2020-06-27 09:01:29 Volcos completos de transmisiones Java Hotspot (TM) VM de 64 bits (25. 221-B11 Modo mixto): "Adjunte el oyente" # 16287 Daemon Prio = 9 OS_PRIO = 0 tid = 0x00007f0814001800 nid = 0x4ff2 Esperando en condición [0x00000000000000] java. lang. thread. state: sincronizadores posibles bloqueados de ejecución ejecutables: - Ninguno........."Handler de referencia" #2 Daemon Prio = 10 OS_PRIO = 0 TID = 0X00007F085814A000 NID = 0x6840 en Object. Wait () [0x00007F083B2F1000] java. lanstate: espera (en monitoreo de objetos) en java. lang. object. wait (método nativo ) en java. lang. object. wait (objeto. java:502) en java. lang. ref. reference. tryhandlepending (reference. java:191) - bloqueado (un java. lang. ref. referefenes e $ Lock) en Java . lang. ref. reference $ referenceHandler. ru (referencia. java: 153) Los sincronizadores propios están bloqueados: - Ninguno "VM Thread" OS_PRIO = 0 TID = 0x00007F0858140800 nid = 0x683f Runnable "GC Task Thread#0 (ParallLGC) OS_PRIO = 0 tid = 0x00007f0858021000 nid = 0x683b runnable "GC Task Hilo#1 (parallelgc)" OS_PRIO = 0 TID = 0x00007f0858022800 nid = 0x683c runnable "GC Tarea Task#2 (ParallLg)" OS_PRIO = 0 TID = 0x00007f0824802480 D ejecutable "Tarea GC Tema#3 (parallelgc) "OS_PRIO = 0 TID = 0x00007F0858026000 NID = 0x683e Runnable" VM PERIUNTIC TARK STRING "OS_PRIO = 0X00007F08581A0000 NID = 0x6847 Esperando en la condición JNI Referencias globales: 15533
Ahora veamos qué podemos explorar usando vertederos de flujo. Si observamos el volcado Afow, podemos ver mucha concentración que puede ser abrumador. Sin embargo, si lo tomamos paso a la vez, puede ser bastante fácil de entender. Vamos a tratar con la primera línea
2020-06-27 09:01:29 Volumen de hilo completo de Java Hotspot (TM) Máquina virtual del servidor de 64 bits (modo mixto 25. 221-B11):
Arriba muestra el momento en que el volcado fue credo e información sobre el JVM utilizado. Más abajo en el volcado podemos ver la lista de subprocesos, el primero de ellos es el hilo de ReferenceHandler.
Análisis de hilos bloqueados
Si analizamos los registros de volcado de subprocesos a continuación, encontraremos que ha detectado hilos con estado bloqueado, lo que degrada en gran medida el rendimiento de la aplicación. Entonces, si podemos encontrar los hilos Bloud, podemos intentar extraer las lecturas de los hilos en las cerraduras que los hilos ARED tratan de obtener. Analizar el rastro de la pila desde el hilo que sostiene el bloqueo puede ayudar a resolver el problema.
[[Correo electrónico protegido]~]# jstac k-l 26680....."DB-procesador-13" Daemon Prio = 5 TID = 0x003EDF98 nid = 0xCA esperando la entrada del monitor [0x00000000000825f000] java. lang. thread. state: bloqueado (en el monitor de objetos) en Beans. connectionPool. getConnection (ConnectionPool. Java:102) - Esperando a bloquear (a Beans. ConnectionPool) en Beans. cus. ServiceCnt. GetTodayCount (ServiceCnt. Java:111) en Beans. cus. serviceCnt. insertCount (ServiceCnt. Java: 43) "DB-Processor-14 "Daemon Prio = 5 TID = 0x003EDF98 NID = 0xCA esperando la entrada del monitor [0x00000000000825F020] java. lang. thread. state: bloqueado (en el monitor de objetos) en frijoless. connectionpool. GetConnection (ConnectionPool. Java:102) - Esperando para bloquear (a Beans. ConnectionPool) en Beans. cus. ServiceCnt. GetTodayCount (ServiceCnt. Java:111) en Beans. cus. serviceCnt. insertCount (ServiceCnt. Java:43).......
Analizar un hilo bloqueado
Otro uso muy común de los volcados de roscas es detectar los enclavamientos. La detección y resolución de cerraduras mutuas puede ser mucho más fácil si analizamos los volcados de hilo.
Un bloqueo mutuo es una situación que involucra al menos dos hilos en las que el otro hilo bloquea un recurso que necesita para continuar la ejecución para continuar la ejecución, mientras que al mismo tiempo un recurso que necesita el segundo hilo está bloqueado por el primer hilo.
Por lo tanto, ninguno de los hilos puede continuar la ejecución, lo que conduce a una situación de enclavamiento y termina con la aplicación colgando. Si hay rastas presentes, la última sección del volcado de subprocesos imprimirá la información de enclavamiento de la siguiente manera.
"Thread-0": esperando para bloquear el monitor 0x00000000250E4982480 (objeto 0x000000000000000000894465B0, un java. lang. object), que se mantiene en "Thread-1" "Thread-1": Waiting to Bloquear el monitor 0x00000000250e4982380 (objeto 0x00000000000000894446565465650466504665ATlang. object), que está sostenido por "Thread-0"....."Threa d-0": en DeadlockedProgram $ DeadLockedRunnableImlementation. run (DeadlockedProgram. java:34) - esperando para bloquear (un java. lang. object) - bloqueado (un java. lang. object) en java. lang. thread. run (run ([Correo electrónico protegido]/Thread. Java: 844) "Threa d-1": en DeadlockedProgram $ DeadLockRunnableImlementation. run (DeadlockedProgram. java:34) - esperando bloquear (un java. lang. object) - Locked (un java. lang. Objeto) en java. lang. thread. run ([correo electrónico protegido] /thread. java:844)
Aquí podemos ver información sobre los enclavamientos en un formato bastante amigable para los humanos.
Además, si resumimos el fragmento de volcado de hilo anterior, contiene la siguiente información.
- El controlador de referencia es el nombre legible por humanos de la transmisión.
- #2 es el identificador único del hilo.
- Daemon indica si el hilo es un hilo de demonio.
- La prioridad numérica del hilo viene dada por Prio = 10.
- El estado actual del hilo se indica con la condición de espera.
- Luego vemos el rastro de la pila, que incluye información de bloqueo.
Analizadores de volcados de flujo
Además del análisis manual, hay muchas herramientas para analizar volcados de flujo, tanto en línea como fuera de línea. A continuación se presentan algunas de las herramientas enumeradas que podemos usar según los requisitos.
Primero, exploremos las herramientas en línea.
№1. Hilo rápido
Quick Thread es la herramienta de análisis de volcado de flujo favorita de los ingenieros de DevOps para solucionar problemas de producción complejos. Es un analizador de volcado de hilo Java en línea. Podemos descargar el volcado de subprocesos como un archivo o copiar directamente y pegar el volcado de subprocesos.
Dependiendo del tamaño, analizará el volcado de flujo y mostrará la información como se muestra en la captura de pantalla.
- FIJA JVM COLLES, REDRISO, FLUGAS DE MEMORIA, CANTRAS, SOPORTAS DE CPU
- RCA instantáneo (no espere a los proveedores)
- Tablero intuitivo
- Soporte de descanso
- Aprendizaje automático
№ 2. Analizador de volcado de flujo de Spotify
Spotify Stream Dump Analyzer se distribuye bajo la Licencia Apache versión 2. 0. Es una herramienta en línea que acepta el volcado de transmisión como un archivo, o podemos copiar y pegar directamente el volcado de transmisión. Dependiendo del tamaño, analizará el volcado de la corriente y mostrará la información como se muestra en la captura de pantalla.
№3. Descripción general de Jstack
Jstack. Overview Analiza los volcados de flujo de Java desde el navegador. Esta página es solo para el cliente.
№ 4. Sitio 24 × 7.
Esta herramienta es un requisito previo para detectar hilos erróneos que degradan el rendimiento de Java Virtual Machine (JVM). Se pueden resolver problemas como bloqueos mutuos, conflictos entre cerraduras y uso excesivo de la CPU por vertederos de roscas individuales visualizando los estados de los volcados de roscas individuales.
La maximización del rendimiento de la aplicación se puede lograr fijando el estado de cada hilo proporcionado por la herramienta.
Ahora echemos un vistazo a las herramientas fuera de línea.
Cuando se trata de perfiles, solo la mejor herramienta servirá.
№1. Jprofiler
JProfiler es uno de los analizadores de volcados de hilos más populares entre los desarrolladores de Java. La interfaz de usuario intuitiva de JProfiler ayuda a eliminar los cuellos de botella de rendimiento, detectar fugas de memoria y comprender los problemas de lectura múltiple.
JProfiler admite el perfil en las siguientes plataformas:
Las siguientes son algunas de las características que hacen de JProfiler la mejor opción para perfilar nuestras aplicaciones en JVM.
- Admite perfiles de bases de datos para JDBC, JPA y NoSQL.
- El soporte para la versión empresarial de Java también está disponible.
- Presenta información de alto nivel sobre las llamadas RMI
- Análisis estelar de fugas de memoria
- Capacidades de control de calidad extensas
- Profiler de hilo incorporado estrechamente integrado con vistas de perfiles de CPU.
- Admite plataformas, IDE y servidores de aplicaciones.
№ 2. IBM TMDA
El analizador de volcados de hilo y monitor de IBM para Java (TMDA) es una herramienta que puede identificar colgantes, enclavamientos, conflictos de recursos y cuellos de botella en los vertederos de hilos Java. Es un producto IBM, pero la herramienta TMDA se proporciona sin ninguna garantía o soporte; Sin embargo, intentan arreglar y mejorar la herramienta con el tiempo.
№3. Mantenimiento de el motor
El administrador de aplicaciones de gestión de motores puede ayudar a controlar el montón JVM y la memoria no altain. Incluso podemos configurar umbrales y recibir alertas por correo electrónico, SMS, etc. y asegurarnos de que la aplicación Java esté configurada correctamente.
№ 4. Tu kit
Su suite consta de los siguientes productos, denominado paquete.
- Java Profiler: un perfilador de bajo costo completo para las plataformas Java EE y Java SE.
- YouMonitor – Monitoreo y perfil de rendimiento de Jenkins, TeamCity, Gradle, Maven, Ant, Junit y Testng.
- . NET Profiler: perfilador de memoria y rendimiento fácil de usar para la plataforma . NET.
Conclusión
Ahora sabe cuán útiles son los volcados de subprocesos para comprender y diagnosticar problemas en aplicaciones multiproceso. Con el conocimiento adecuado de los vertederos de subprocesos (su estructura, la información que contienen, etc., podemos usarlos para identificar rápidamente las causas de los problemas.