Ich versuche mehr über Java zu verstehen, insbesondere über Speicherverwaltung und Threads. Aus diesem Grund habe ich kürzlich Interesse an Thread-Dumps gefunden.
Hier sind einige Zeilen aus einer Web-App mit VisualVM, einem integrierten Tool für Java:
"Finalizer" daemon prio=8 tid=0x02b3d000 nid=0x898 in Object.wait() [0x02d0f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x27ef0288> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked <0x27ef0288> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
Locked ownable synchronizers:
- None
"Reference Handler" daemon prio=10 tid=0x02b3b800 nid=0x494 in Object.wait() [0x02cbf000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x27ef0310> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x27ef0310> (a java.lang.ref.Reference$Lock)
Zuerst habe ich Fragen zu einigen Variablennamen:
- was bedeutet tid und nid?
- Was ist die Zahl in eckigen Klammern nach Object.wait?
Dann für den Stack-Trace selbst:
- Was bedeutet es, auf <.....> (a java.lang ....) zu warten und wie lautet die Nummer in <..>
- Was bedeutet es gesperrt <.....> (eine java.lang ....) gleiche Frage, was ist in <..>
Ich dachte, dass das gesperrte Wort in irgendeiner Weise mit einer Wartebedingung zusammenhängt, aber ich habe mich geirrt. Tatsächlich frage ich mich, warum das Sperren dreimal wiederholt wird, aber der Thread befindet sich im ausführbaren Zustand, wie im selben Speicherauszug gezeigt:
"Thread-0" prio=6 tid=0x02ee3800 nid=0xc1c runnable [0x03eaf000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:199)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
- locked <0x23963378> (a java.io.BufferedInputStream)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
- locked <0x23968450> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
- locked <0x23968450> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at org.codehaus.plexus.util.cli.StreamPumper.run(StreamPumper.java:145)
Als letztes war dies das Schlimmste von ihnen:
"CompilerThread0" daemon prio=10 tid=0x02b81000 nid=0x698 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
Dieser Thread befindet sich im ausführbaren Zustand, wartet jedoch unter bestimmten Bedingungen. Welcher Zustand und was ist 0x00000?
Warum ist der Stack-Trace so kurz ohne Hinweise auf die Thread-Klasse?
Wenn Sie alle meine Fragen beantworten könnten, wäre ich Ihnen sehr dankbar.
Vielen Dank
quelle