测量JVM的CPU使用情况:java代码

时间:2011-05-06 06:18:32

标签: java performance cross-platform jmx cpu-usage

有没有办法测量JVM的CPU使用率(一旦启动java应用程序)跨平台(windows + unix + mac)? 我使用过Jconsole,但我需要的是一个执行此操作的java代码,而不是一个可以监视CPU利用率的工具。 我试过了

ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage()

使用JMX,但它没有帮助,因为我需要的是JVM的特定CPU使用率(比如当我启动服务器时),而不是系统负载平均值。

7 个答案:

答案 0 :(得分:8)

您应该查看Thread MBean中的ThreadMXBean.getCurrentCPUTime()方法。

  

线程CPU时间

     

Java虚拟机   实施可能支持测量   当前线程的CPU时间,   任何线程,或没有线程。

还有JTOP示例应用程序是JDK jdk\demo\management\JTop\src\JTop.javahere的一部分。看看:

/**
 * Get the thread list with CPU consumption and the ThreadInfo for each thread
 * sorted by the CPU time.
 */
private List<Map.Entry<Long, ThreadInfo>> getThreadList()

答案 1 :(得分:2)

Java本身没有提供此功能。有几个开源API可用于衡量CPU使用率。
我推荐Sigar API。除CPU使用外,您还可以获得更多其他功能,如内存使用,系统正常运行时间等。

答案 2 :(得分:2)

在任何给定的时刻,线程正在运行(100%的核心)或不运行(0%)。 中间没有。 你需要的是一个短期的线程运行状态快照系列,并将其平均值。

答案 3 :(得分:2)

来自here

    com.sun.management.OperatingSystemMXBean operatingSystemMXBean = 
         (com.sun.management.OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
    RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
    int availableProcessors = operatingSystemMXBean.getAvailableProcessors();
    long prevUpTime = runtimeMXBean.getUptime();
    long prevProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
    double cpuUsage;
    try 
    {
        Thread.sleep(500);
    } 
    catch (Exception ignored) { }

    operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    long upTime = runtimeMXBean.getUptime();
    long processCpuTime = operatingSystemMXBean.getProcessCpuTime();
    long elapsedCpu = processCpuTime - prevProcessCpuTime;
    long elapsedTime = upTime - prevUpTime;

    cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 10000F * availableProcessors));
    System.out.println("Java CPU: " + cpuUsage);

答案 4 :(得分:1)

也许this或类似的图书馆可以帮助你。

答案 5 :(得分:0)

使用纯Java无法以编程方式查询CPU使用情况。根本就没有API。建议的替代方法可能使用Runtime.exec()来确定JVM的进程ID(PID),调用外部的,特定于平台的命令(如ps),并解析其输出以获得感兴趣的PID。

See this link

答案 6 :(得分:0)

您可以尝试使用https://github.com/mvysny/webmon。您只需将webmon-analyzer jar添加到您的项目中,然后将启动采样器和TCP / IP服务器。采样器将轮询JMX API,并将统计信息保留一段时间,然后您可以简单地telnet localhost 5455来获取这些统计信息的文本转储。很棒的制作。免责声明:我是作者,项目很旧。