我想更深入地了解Java,特别是内存管理和线程方面的知识。因此,我最近对查看线程转储感到很有兴趣。
以下是使用Java内置工具VisualVM获取的一个Web应用程序的几行:
"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)
首先我有一些关于变量名的问题:
- tid和nid是什么意思?
- 在Object.wait后的方括号中的数字代表什么?
接下来是关于堆栈跟踪本身的问题:
- waiting on <.....> (a java.lang....) 是什么意思,以及 <..> 中的数字代表什么?
- locked <.....> (a java.lang....) 同样的问题,<..> 中的内容是什么?
我曾认为单词“locked”与等待条件有关,但我错了。事实上,我想知道为什么“locked”重复三次,但线程在相同的转储中处于可运行状态:
"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是什么?
为什么堆栈跟踪如此简短,没有任何线程类的证据?
如果您能回答我所有的问题,我将非常感激。
谢谢
cpu=nnnn
表示线程实际占用的CPU时间(以秒为单位)。例如,如果你有一个繁忙循环("100%利用率")的线程,你可以查看cpu
,倒数计算,并找到它实际进入忙碌循环的大致时间,以便通过带时间戳的日志等进行进一步的故障排除。 - Janaka Bandara