如何使用JMX访问远程JVM的线程?
答案 0 :(得分:2)
这是一个非常古老的主题,但由于我正在寻找并找到这个问题的实际答案,我可以发布它。
以上显示了一个关于如何访问远程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中的线程等。
尝试复制已存在的调试功能毫无意义。