首页 文章

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

提问于
浏览
11

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

ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage()

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

6 回答

  • 2

    您应该查看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

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

  • 8

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

  • 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);
    
  • 0

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

  • 2

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

    See this link

相关问题