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.
aggiungere spiegazione. – egorlitvinenko