Как проанализировать дамп потока Java?

Я пытаюсь понять больше о Java, особенно об управлении памятью и потоками. По этой причине я недавно обнаружил интерес к просмотру дампов потоков.

Вот несколько строк, взятых из веб-приложения, использующего VisualVM, встроенный инструмент для 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)

Сначала у меня есть вопросы по поводу некоторых имен переменных:

что значит тид и нид?Какая цифра в квадратных скобках после Object.wait?

Тогда для самой трассировки стека:

что это значитв ожидании <.....> (a java.lang ....) и какой номер в<..>что это значитзаблокирован <.....> (a java.lang ....) тот же вопрос, что в<..>

Я думал, что слово «заблокировано» каким-то образом связано с условием ожидания, однако я ошибся. На самом деле, мне интересно, почему заблокирован повторяется три раза, но поток находится в состоянии выполнения, как видно из того же дампа:

"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)

И наконец, это был худший из них:

"CompilerThread0" daemon prio=10 tid=0x02b81000 nid=0x698 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

Этот поток находится в рабочем состоянии, но он находится в состоянии ожидания. В каком состоянии и что такое 0x00000?

Почему трассировка стека такая короткая без каких-либо признаков класса потока?

Если бы вы могли ответить на все мои вопросы, я был бы очень признателен.

Спасибо

Ответы на вопрос(2)

Ваш ответ на вопрос