java - JMX 结果令人困惑

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

过去几天我一直在尝试学习 JMX,但现在很困惑。

  1. 我编写了一个简单的 JMX 程序,它使用包 java.lang.management 的 API 并尝试提取 Pid、CPU 时间、用户时间。在我的结果中,我只获得当前 JVM 线程的结果,即我的 JMX 程序本身,但我认为我应该获得同一台机器上 JVM 上运行的所有进程的结果。我如何获取 JVM(LINUX/WD)中运行的所有 java 进程的 pid、cpu 时间、用户时间。
  2. 我应该如何获取我的机器(LINUX/WD)中运行的所有非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);
    }
}

我总是得到结果:

The name of the id is Attach Listener
The name of the id is Signal Dispatcher
The name of the id is Finalizer
The name of the id is Reference Handler
The name of the id is main

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

最佳答案

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

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

听起来您想要做的基本上是使用开箱即用的 JDK 提供的库存 API 编写自己的管理控制台。简短的回答:你无法从这里到达那里。稍微长一点的答案:你可以从这里到达那里,但是路很长,蜿蜒,全程都是上坡,当你完成后,你很可能会希望你走了一条不同的路线(阅读:使用已编写的管理控制台)。

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

关于java - JMX 结果令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21446955/

相关文章:

java - 了解 Jeprofile 输出

创建一个 GUI 来绘制 Linux 中的 CPU 使用率

linux - 根据负载估算所需的核心容量?

java - 自定义 Maven 插件失败 : java. lang.ArrayIndexOutOfBoundsException : 3379 at org. objectweb.asm.ClassReader.<init>(未知来源)

java - "="位于消息摘要末尾

java - 可以假设 Java Concurrent Mark Sweep Garbage Collector 在 Linux 和 Mac 以及 Windows 上同样出色吗?

c# - 确定高处理器使用率的来源

java - Dozer:如何限制映射的深度?

java - 具有大量实体的 Ehcache/Hibernate 和 RMI 复制

java - 现代 JVM 是否优化了简单的内联匿名类分配?