Java JMX结果令人困惑

Java JMX结果令人困惑,java,jvm,cpu-usage,jvm-hotspot,jvm-languages,Java,Jvm,Cpu Usage,Jvm Hotspot,Jvm Languages,在过去的几天里,我一直在努力学习JMX,现在我在这里感到困惑 我已经编写了一个简单的JMX程序,它使用包java.lang.management的API并试图提取Pid、CPU时间和用户时间。在我的结果中,我只得到当前JVM线程的结果,这是我的JMX程序本身,但我认为我应该得到在同一台机器上通过JVM运行的所有进程的结果。如何获取JVM(LINUX/WDs)中运行的所有java进程的PID、cpu时间和用户时间 我应该如何获得在我的机器(LINUX/WDs)上运行的所有非java进程的PID、c

在过去的几天里,我一直在努力学习JMX,现在我在这里感到困惑

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

    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);
        }
    }
    
    public void update()引发异常{
    final ThreadMXBean=ManagementFactory.getThreadMXBean();
    final long[]ids=bean.getAllThreadIds();
    final ThreadInfo[]infos=bean.getThreadInfo(id);
    用于(长id:id){
    if(id==threadId){
    继续;//排除轮询线程
    }
    final long c=bean.getThreadCpuTime(id);
    final long u=bean.getThreadUserTime(id);
    如果(c=-1 | | u=-1){
    continue;//线程已死亡
    }
    }
    字符串名称=null;
    for(int i=0;i
    我总是得到这样的结果:

    id的名称是Attach Listener
    id的名称是信号调度器
    id的名称是Finalizer
    id的名称是引用处理程序
    id的名称是main


    我的机器上运行着其他一些java进程,它们没有包含在bean.getAllThreadIds()API的结果中。

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

    通过
    ManagementFactory
    公开的API只允许监视代码运行的JVM。要监视其他JVM,您必须使用JMX远程API(
    javax.management.remote
    ),这就引入了一系列必须处理的新问题

    听起来您想要做的基本上是使用现成的JDK提供的库存API编写自己的管理控制台。简短回答:你不能从这里到达那里。稍长一点的回答:你可以从这里到达那里,但是整条路都很长,蜿蜒,上坡(几乎),当你完成后,你很可能会希望自己走的是另一条路(请阅读:使用已经编写好的管理控制台)


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

    请发布您用来调用JMX API的代码的相关部分。可能是您混淆了JVM中的JVM进程和线程吗?您的代码经过正在执行的JVM的线程,但在您的问题中,您说的是“所有java进程”。对不起,我为交替使用JVM进程和线程术语表示歉意。1.运行单个JVM。2.在while条件下运行两个具有true的java程序。3.同时,运行上面的JMX程序,了解CPU利用率和用户时间。4.我假设JMX程序应该给我所有java程序(步骤2和步骤3)的CPU利用率时间和用户时间,但通过上面的代码,我只得到JMX程序(步骤3)的CPU利用率时间和用户时间5.我需要在我的机器的JVM中运行的所有java程序的CPU利用率时间和用户时间。“有什么用“-在云计算的这些日子里,我认为能够自动监控机器上其他进程的CPU负载以实现自动扩展非常有用。Amazon EC2已经在机器级别收集了这些统计数据,但它还允许您定义自己的更具体的应用程序。这是否意味着如果我的系统中运行两个java应用程序,它们都将在各自的JVM中运行?谢谢您的时间。那么,您能告诉我JMX是如何运行的吗?JMX用于监视在同一台机器上运行的所有java和非java进程。如果JMX在自己的JVM中独立运行,而其他java程序在自己的JVM中分别在同一台机器上运行,那么如何使用ManagementFactory库监控在同一台机器上运行的所有java和非java程序有人能告诉我JMX是如何工作的吗?我已经阅读了在线教程,但仍然不确定JMX是如何工作的,如何让所有进程在LINUX机器上运行,这些进程使用了多少系统资源、时间等等