如何使用JMX访问远程JVM的线程?

时间:2011-01-28 20:54:40

标签: java jmx

如何使用JMX访问远程JVM的线程?

2 个答案:

答案 0 :(得分:2)

这是一个非常古老的主题,但由于我正在寻找并找到这个问题的实际答案,我可以发布它。

http://www.java2s.com/Code/Java/Development-Class/ThisFullThreadDumpclassdemonstratesthecapabilitytogetafullthreaddumpandalsodetectdeadlockremotely.htm

以上显示了一个关于如何访问远程JMX上所有线程的非常好的示例。

在概要中:

// First connect to the remote service
String urlPath = "/jndi/rmi://" + hostname + ":" + port + "/jmxrmi";
JMXServiceURL url = new JMXServiceURL("rmi", "", 0, urlPath);
JMXConnector jmxc = JMXConnectorFactory.connect(url);
MBeanServerConnection server = jmxc.getMBeanServerConnection();

// Then get all threads
ThreadMXBean tmbean = newPlatformMXBeanProxy(server, THREAD_MXBEAN_NAME, ThreadMXBean.class);
ObjectName tmbean = new ObjectName(THREAD_MXBEAN_NAME);
long[] tids = tmbean.getAllThreadIds();
ThreadInfo[] tinfos = tmbean.getThreadInfo(tids, Integer.MAX_VALUE);
for (ThreadInfo ti : tinfos) {
  // do something with this particular thread...
}

强调可能需要编写自己的监控工具,如@ aaron-mciver所述;线程包含大量信息,并且在业务流程中可能存在大量线程,例如,可能无法通过在VisualVM中对它们进行调查来查看它们。 以编程方式循环遍历线程以查找特定关键字,CPU时间,堆栈跟踪,涉及的文件名等等,这是很有意义的。

答案 1 :(得分:1)

为什么不使用jvisualvm作为SDK的一部分,并且可以让您访问给定JVM中的线程等。

尝试复制已存在的调试功能毫无意义。