JVM Thread-Dumps, die Monitore ohne sperrende Threads enthalten

8

Was könnte die Ursache für JVM-Thread-Dumps sein, die Threads anzeigen, die darauf warten, auf einem Monitor zu sperren, aber die Monitore nicht über entsprechende gesperrte Threads verfügen?

Java 1.5_14 unter Windows 2003

    
Kevin 15.09.2008, 17:36
quelle

6 Antworten

1

Verwendet Ihr Code bei jeder Änderung JNI? (d. h. führen Sie einen systemeigenen Code aus, der von Java gestartet wurde?).

Wir haben ein ähnliches Verhalten gesehen, aber JDK 1.6.0_05. App scheint Deadlock zu sein, aber Jstack zeigt Threads, die auf eine Sperre warten, an der sich keine anderen Threads festhalten. Wir haben einen JNI-Code, also ist es möglich, dass wir etwas korrumpieren.

Wir haben dafür keine Lösung gefunden und das Problem ist nur auf einer Maschine reproduzierbar.

    
Joshua McKinnon 17.09.2008 03:15
quelle
1
Warten diese wartenden Threads auf immer oder gehen sie schließlich weiter?

Falls Letzteres zutrifft, kann es sein, dass die Sperre vom Garbage Collector gehalten wird.

Sie können die Argumente -verbose:gc with -XX:+PrintGCDetails in Ihrer Java-Befehlszeile hinzufügen, um informiert zu werden, wenn GCs auftreten. Wenn die GC-Aktivität mit Ihren Verlangsamungen zusammenfällt, kann dies darauf hindeuten, dass dies das Problem ist.

Hier finden Sie einige Informationen zur Garbage Collection .

    
tgdavies 17.09.2008 03:31
quelle
0

Das ist nur eine wilde Vermutung, aber könnte es sein, dass ein Thread sich selbst blockiert, indem er versucht, zweimal eine Sperre zu erhalten? Wahrscheinlich würde es helfen, wenn Sie etwas Code schreiben könnten.

    
jrudolph 15.09.2008 18:33
quelle
0

Ja, normalerweise muss jeder Monitor, der gesperrt ist, einen Besitzer-Thread haben. Vielleicht war Ihr Stack Dump nicht vollständig (zu lang) oder das Dumping war nicht konsistent. Ich könnte mir vorstellen, dass es die Welt nicht stoppt, also wird ein gesperrter Monitor weggeworfen, aber der Thread, dem die Sperre gehört, gibt ihn frei, bevor er gelöscht wird (das ist nur eine Vermutung).

Können Sie den Dump als Textdatei hochladen, um die Suche zu erleichtern und uns sagen, welchen Monitor Sie betrachten.

    
eckes 16.09.2008 18:47
quelle
0

Ich hatte heute ein ähnliches Problem und es beinhaltete auch Zugriffe auf statische Ressourcen.

Die kurze Version ist, dass eine Klasse GUI-Änderungen in einem statischen Block vorgenommen hat und außerhalb des AWT-EventQueue-Threads, die von der AWT TreeLock blockiert wurden, hat die EventQueue einen Verweis auf die blockierte Klasse gemacht, die sie zwang Warte auf dem Monitor des Klassenladers für diese Klasse.

Die wichtigste Beobachtung hier ist, dass die Sperre für den Klassenlader nicht als im Thread-Dump gesperrt angezeigt wurde.

Die vollständige Antwort finden Sie in diesem Thread .

    
Ryan Gross 16.09.2010 16:47
quelle
0

Haben Sie versucht, auf Java 1.6 zu aktualisieren? Ein Fehler könnte Ihr Problem sein, wenn Sie nur auf 1.5 sind.

    
Chris Dennett 16.09.2010 16:49
quelle

Tags und Links