我正在努力学习最近几天的JMX,现在在这里感到困惑。
我的代码如下:
public void update() throws Exception{
final ThreadMXBean bean = ManagementFactory.getThreadMXBean();
final long[] ids = bean.getAllThreadIds();
final ThreadInfo[] infos = bean.getThreadInfo(ids);
for (long id : ids) {
if (id == threadId) {
continue; // Exclude polling thread
}
final long c = bean.getThreadCpuTime(id);
final long u = bean.getThreadUserTime(id);
if (c == -1 || u == -1) {
continue; // Thread died
}
}
String name = null;
for (int i = 0; i < infos.length; i++) {
name = infos[i].getThreadName();
System.out.print("The name of the id is /n" + name);
}
}
我总是得到结果:
id的名称是Attach Listener
id的名称是Signal Dispatcher
id的名称是Finalizer
id的名称是Reference Handler
id的名称是主要的
我的机器上运行了一些其他java进程,它们没有包含在bean.getAllThreadIds()API的结果中..
答案 0 :(得分:1)
通过ManagementFactory
公开的API允许您仅监视运行代码的JVM。要监视其他JVM,您必须使用JMX Remoting API(javax.management.remote
),这会引入您必须处理的全新问题。
听起来你想要做的就是使用开箱即用的JDK提供的库存API编写自己的管理控制台。简短的回答:你不能从这里到达那里。稍微长一点的答案:你可以从这里到达那里,但道路很长,蜿蜒,上坡(几乎)整个路上,当你完成后,你很可能希望你走的是另一条路(读到:使用一个已编写的管理控制台。)
我建议您使用JConsole或其他一些管理控制台来监控您的应用程序。根据我的经验,通常只有人(而不是程序)才能解释由各种MBean提供的统计数据,这些MBean的引用可以通过ManagementFactory
静态方法获得。毕竟,如果某个程序可以访问某些其他进程所使用的CPU数量,那么它对该信息的用途是什么(除了以某种人类可读的格式提供)?