Figure 9: Threads Tab.
左下角列出了所以正在运行的线程。如果你在过滤器中输入一个字符,线程列表将仅显示线程名字包含你输入字符的线程。通过点击某个线程,你可以获取这个线程的相关信息。 线程的MBean标签提供了一些Thread标签没有提供有用的操作。
findMonitorDeadlockedThreads. 如果发生线程死锁,可以通过这个检查出来。操作返回一组死锁的线程ID. getThreadInfo. 返回线程的信息。包括线程的名称、堆栈信息,导致当前线程阻塞的锁,如果有的话,还返回哪儿线程持有这个锁,和这个线程信息的统计. getThreadCpuTime.返回指定线程消耗的CPU时间.
为使用上面这些属性,可以到MBeans标签下,在MBeans树上选择Threading MBean。它列出了当前监控的JVM所有属性的操作。
Figure 10: MBeans Tab Threading.
为检查你的应用是否进入死锁(例如,你的应用挂起),你可以使用findMonitorDeadlockedThreads
操作。
Figure 11: Find Deadlocked Threads.
一旦你选择了findMonitorDeadlockedThreads按钮,将会有一个弹出窗口显示结果。在上面例子中,JConsole连接了一个存在3个死锁线程的示例应用SampleTest。如上所示,检查出ID为12,10和11的线程死锁。想查询更多的线程信息,可以使用getThreadInfo操作。线程的MBean支持getThreadInfo操作的四种形式:
对一个给定的线程ID,给出最深的堆栈情况
对一系列的线程ID,给出最深的堆栈情况
Of a given thread ID with no stack trace.
Of an array of thread IDs with no stack trace.
对应死锁情况,你一般会比较关系堆栈情况。你可以在getThreadInfo操作的第一个参数中输入死锁的线程ID和你想跟踪的堆栈深度。
Figure 12: ThreadInfo for Thread ID = 12.
双击stackTrace属性的值域将会显示一个复合对话框,你可以在堆栈中来回查看。图13,14显示了死锁线程-1的复合对话框中的第一层堆栈和第二层堆栈。
Figure 13: Top Frame of the Stack Trace of DeadlockedThread-1.
Figure 14: Second Frame of the Stack Trace of DeadlockedThread-1.
线程标签页提供了一个友好的界面供查看线程的堆栈。你可以找到死锁线程的名字,使用getThreadInfo
查找线程信息。然后又可以使用线程标签页来分析死锁。
控制日志等级
Logging MBean定义了LoggerNames
属性,用于描述日志名称。为找到你的应用的日志,可以选择在MBeans树中java.util.logging
下的Logging MBean,双击LoggerNames属性