De manera predeterminada, con Hotspot, un volcado de subprocesos CTRL-Break no mostrará los hilos que contienen java.lang.concurrent
bloqueos. Y entiendo que con estos bloqueos, Hotspot no puede tener información sobre en qué marco de pila se adquirió un bloqueo. Si agrega la opción de JVM -XX:+PrintConcurrentLocks
, un volcado de la pila CTRL-Break mostrará una lista (después del rastreo de la pila de un subproceso) de cualquier bloqueo simultáneo retenido por ese marco. Por ejemplo:¿Por qué esta opción de JVM de Hotspot no es la predeterminada? -XX: + PrintConcurrentLocks
"D-Java-5-Lock" prio=6 tid=0x00000000069a1800 nid=0x196c runnable [0x000000000770f000]
java.lang.Thread.State: RUNNABLE
at com.Tester.longDelay(Tester.java:41)
at com.Tester$D.run(Tester.java:88)
Locked ownable synchronizers:
- <0x00000007d6030898> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
Sin esta opción, no es posible averiguar qué hilo está llevando a cabo este bloqueo en un post-mortem. ¿Por qué esta opción no es la predeterminada? ¿Hay alguna ejecución no obvia o una penalización de estabilidad? Cuando busco para encontrar una discusión sobre esto, no aparece nada.
add explanation. – egorlitvinenko