2011-08-15 9 views
6

Per impostazione predefinita, con Hotspot, un dump del thread CTRL-Break non elenca i thread che contengono i blocchi java.lang.concurrent. E capisco che con questi blocchi, Hotspot non può avere informazioni su quale frame dello stack è stato acquisito un lock. Se si aggiunge l'opzione JVM -XX:+PrintConcurrentLocks, un dump di stack CTRL-Break elencherà (dopo la traccia dello stack di un thread) tutti i blocchi concomitanti trattenuti da tale frame. Ad esempio:Perché questa opzione Hotspot JVM non è l'impostazione predefinita? -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) 

Senza questa opzione, non è possibile capire quale filo è in possesso di questo blocco in un post-mortem. Perché questa opzione non è quella predefinita? C'è qualche penalità di performance o di stabilità non ovvia? Quando cerco di trovare una discussione su questo, non viene fuori nulla.

risposta

2

Ho chiesto a Oracle (il mio datore di lavoro ha un contatto di supporto) e la risposta è fondamentalmente che l'opzione è sicura da utilizzare e che molte funzionalità puramente diagnostiche sono disabilitate di default e questa è una di quelle opzioni. IMO, se una funzione diagnostica è sicura e stabile e non introduce una penalità di prestazioni, dovrebbe essere attivata per impostazione predefinita. Sembra che questa non sia la vista al (allora) Sole e (ora) Oracle.

+0

aggiungere spiegazione. – egorlitvinenko

2

Bene, la mia ipotesi è che sia instabile, oppure i manutentori JVM (Sun-now-Oracle) semplicemente non vogliono mantenerlo come funzionalità supportata. Puoi dirlo semplicemente con il prefisso -XX::

Le opzioni specificate con -XX non sono stabili e non sono consigliate per l'uso occasionale. Queste opzioni sono soggette a modifiche senza preavviso.

- da Java HotSpot VM Options

anche da quella pagina, che l'opzione può essere attivata o disattivata in modo dinamico tramite l'interfaccia di gestione JDK, in modo da poter attivare tramite un MXBean se avete bisogno.

Flags contrassegnati come gestibile dinamicamente scrivibili attraverso l'interfaccia di gestione JDK (API com.sun.management.HotSpotDiagnosticMXBean) e anche attraverso JConsole. In Monitoraggio e gestione delle applicazioni della piattaforma Java SE 6, la figura 3 mostra un esempio. Le flag gestibili possono anche essere impostate tramite jinfo -flag.

Infine, lo strumento Stack Trace jstack può eseguire la stessa funzionalità in qualsiasi momento senza richiederlo abilitato in ogni momento.

0

Perché solo ReentrantLocks sa quali thread sono correlati. Per ottenere queste informazioni su Runtime, la realizzazione di questo metodo va oltre l'heap per trovare tutti i blocchi e i relativi thread.

Problemi correlati