2011-08-15 16 views
6

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.

Respuesta

2

Le pregunté a Oracle (mi empleador tiene un contacto de soporte) y la respuesta es básicamente que la opción es segura de usar y que muchas funciones de diagnóstico puro están deshabilitadas por defecto y esta es una de esas opciones. OMI, si una característica de diagnóstico es segura y estable y no introduce una penalización de rendimiento, entonces debería estar activada por defecto. Parece que esta no es la vista en (entonces) Sun y (ahora) Oracle.

+0

add explanation. – egorlitvinenko

2

Bueno, supongo que es inestable, o los mantenedores de JVM (Sun-now-Oracle) simplemente no quieren mantenerlo como una función admitida. Puede decir esto simplemente con el prefijo -XX::

Las opciones que se especifican con -XX no son estables y no se recomiendan para uso casual. Estas opciones están sujetas a cambios sin previo aviso.

- desde Java HotSpot VM Options

También desde esa página, esa opción se puede activar de forma dinámica o desactivar a través de la interfaz de gestión de JDK, por lo que se puede activar a través de un MXBean si es necesario.

Banderas marcados como manejable son dinámicamente se puede escribir a través de la interfaz de gestión de JDK (API com.sun.management.HotSpotDiagnosticMXBean) y también a través de JConsole. En Supervisión y administración de las aplicaciones de plataforma Java SE 6, la Figura 3 muestra un ejemplo. Los indicadores manejables también se pueden establecer a través de jinfo -flag.

Finalmente, la herramienta jstack Stack Trace puede realizar la misma funcionalidad en cualquier momento sin necesidad de que esté habilitada todo el tiempo.

0

Porque, solo ReentrantLocks sabe con qué hilos están relacionados. Para obtener esta información sobre la ejecución de este método en tiempo de ejecución, vaya a Heap para encontrar todos los bloqueos y sus subprocesos.

Cuestiones relacionadas