JMX结果令人困惑

时间:2014-01-30 02:57:35

标签: java jvm cpu-usage jvm-hotspot jvm-languages

我正在努力学习最近几天的JMX,现在在这里感到困惑。

  1. 我编写了一个简单的JMX程序,它使用java.lang.management包的API并尝试提取Pid,CPU时间和用户时间。在我的结果中,我只得到当前JVM线程的结果,这是我的JMX程序本身,但我认为我应该得到在同一台机器上通过JVM运行的所有进程的结果。我将如何获得在JVM(LINUX / WDs)中运行的所有Java进程的pids,cpu时间和用户时间。
  2. 我应该如何获得在我的机器上运行的所有非java进程的pids,cpu时间和用户时间(LINUX / WDs)。
  3. 我的代码如下:

    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的结果中..

1 个答案:

答案 0 :(得分:1)

啊,现在我明白了你想做什么。我恐怕有一些坏消息。

通过ManagementFactory公开的API允许您仅监视运行代码的JVM。要监视其他JVM,您必须使用JMX Remoting API(javax.management.remote),这会引入您必须处理的全新问题。

听起来你想要做的就是使用开箱即用的JDK提供的库存API编写自己的管理控制台。简短的回答:你不能从这里到达那里。稍微长一点的答案:你可以从这里到达那里,但道路很长,蜿蜒,上坡(几乎)整个路上,当你完成后,你很可能希望你走的是另一条路(读到:使用一个已编写的管理控制台。)

我建议您使用JConsole或其他一些管理控制台来监控您的应用程序。根据我的经验,通常只有人(而不是程序)才能解释由各种MBean提供的统计数据,这些MBean的引用可以通过ManagementFactory静态方法获得。毕竟,如果某个程序可以访问某些其他进程所使用的CPU数量,那么它对该信息的用途是什么(除了以某种人类可读的格式提供)?