La JVM mi dice che si è verificata una situazione di stallo:"Trovato 1 stallo", ma traccia mostra che non bloccato da qualsiasi thread
Found one Java-level deadlock:
=============================
"TP-Processor107":
waiting for ownable synchronizer 0x00002aaaf58e70f0, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),
which is held by "indexTrackerThread3"
"indexTrackerThread3":
waiting for ownable synchronizer 0x00002aaaf4394580, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),
which is held by "TP-Processor16"
"TP-Processor16":
waiting for ownable synchronizer 0x00002aaaf58e70f0, (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync),
which is held by "indexTrackerThread3"
possiamo vedere che indexTrackerThread3
è in attesa di una risorsa detenuta da TP-Processor16
e vice -versa. Questo è davvero un punto morto.
Possiamo vedere che indexTrackerThread3
è in attesa di 0x00002aaaf4394580
:
"indexTrackerThread3":
- parking to wait for <0x00002aaaf4394580>
La mia domanda:
In the threads dump, perché non c'è alcuna linea - locked <0x00002aaaf4394580>
?
sembra 0x00002aaaf58e70f0 in realtà non è bloccato da qualsiasi thread. Cosa potrebbe bloccarlo?
In tutta la documentazione di deadlock che ho letto (example), per ogni diversa linea - parking to wait for <0x123>
, c'è sempre una riga - locked <0x123>
. Quindi comincio a sospettare un bug JVM. Sto fraintendendo qualcosa?
Nota: Ci scusiamo per il collegamento a pastebin, ma la domanda non è risolvibile senza avere il dump completo. Per brevità, ho rimosso tutte le righe che contenevano "at", non includono alcuna informazione di blocco.
Grazie per il collegamento! Ora mi sono reso familiare con la classe Unsafe. Anche se eseguito tramite una chiamata a Unsafe.park, il blocco viene ancora da una chiamata Java, quindi perché la parte 'locked <0x123>' non può essere scritta su quella linea? Gradirei qualsiasi documentazione che parli del particolare problema dell'ID che non è presente. –