Jconsole与Jmx 分析JVM状况(下) 转
线程(ThreadMXBean )
从 Jconsole 画面取得线程画面如下:
左下角列出了所以正在运行的线程。通过点击某个线程,右下脚可以看到这个线程的相关信息。
Mean 中提供 ThreadMXBean 相关属性和操作如下
详细个属性说明请看http://gceclub.sun.com.cn/Java_Docs/jdk6/html/zh_CN/api/java/lang/management/ThreadMXBean.html
代码中取得 ThreadMXBean
public class JmxRemote { public static void main(String[] args) { try {JMXServiceURL address = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi"); JMXConnector connector = JMXConnectorFactory.connect(address); MBeanServerConnection mbs = connector.getMBeanServerConnection(); ThreadMXBean threadBean = ManagementFactory.newPlatformMXBeanProxy(mbs, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class); //---取得你需要的线程相关讯息 参照API 其中上图的这些属性和API都可以通过自己写代码操作 } catch(Exception e){ e.printStackTrace(); } } }
常用一些 API 使用说明:
findMonitorDeadlockedThreads 查找死锁线程,返回的死锁线程 list
其中 Jconsole 也提供了该操作
getThreadInfo ( Jconsole ) MBean 支持 getThreadInfo 操作的两种形式,
-
返回指定 id 的不具有堆栈跟踪的线程的线程信息。 getThreadInfo(long id)
-
返回指定 id 的线程的线程信息,并带有指定堆栈追踪元素数的堆栈追踪。 getThereadInfo(long id,int MaxDepth)
实际代码中还提供另外三种取得线程讯息操作
-
返回其 ID 在输入数组 ids 中的每个线程的线程信息,并带有指定堆栈追踪元素数的堆栈追踪。 getThreadInfo (long[] ids, int maxDepth)
-
返回每个线程的线程信息,线程 ID 位于输入数组 ids 中,带有堆栈跟踪和同步信息。 getThreadInfo (long[] ids, boolean lockedMonitors, boolean lockedSynchronizers)
-
返回其 ID 在输出数组 ids 中的每个线程的线程信息,这些线程不具有堆栈跟踪。 getThreadInfo (long[] ids)
例如: Jconsole 使用:首先输入线程 ID ( 9 ) 及堆栈深度( 10 )
点 getThreadInfo 弹出如下对话框
如上你会看到这个线程 stackTrace 的深度是 7 。双击黑色部分如下图可以看到堆栈信息
点“ <” 或者“ >” 按钮 可以查看每层讯息
通过查看 stack 我们可以找到死锁线程代码信息
当然在代码中也能取得相关讯息,如下代码 :
ThreadInfo ti=threadBean.getThreadInfo(9, 10); StackTraceElement[] st=ti.getStackTrace(); for(StackTraceElement el:st) System.out.println(el); 输出: java.net.PlainSocketImpl.socketAccept(Native Method) java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384) java.net.ServerSocket.implAccept(ServerSocket.java:450) java.net.ServerSocket.accept(ServerSocket.java:421) sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:369) sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:341) java.lang.Thread.run(Thread.java:619)
获取操作系统资源信息( MemoryManagerMXBean )
MemoryManagerMXBean 提供查看操作系统相关讯息 , 具体 API 请参考
当打开 MBeans 标签下的 Operating System MBean ,你可以看到平台可以执行的所有属性和操作。你可以监控任何一个属性随时间的变化——如, CPU 时间