测量JVM的CPU使用率:java代码

测量JVM的CPU使用率:java代码,java,performance,cross-platform,jmx,cpu-usage,Java,Performance,Cross Platform,Jmx,Cpu Usage,有没有一种方法可以跨平台(windows+unix+mac)测量JVM(一旦java应用程序启动)的CPU使用率? 我使用过Jconsole,但我需要的是一个实现这一点的java代码,而不是一个可以监视CPU利用率的工具。 我试过了 ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage() 使用JMX,但没有帮助,因为我需要的是JVM的特定CPU使用量(比如启动服务器时),而不是系统平均负载。使用纯Java编程查询C

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

ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage()

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

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


Java本身不提供此功能。有两个开源API可用于测量CPU使用情况

我推荐。除了CPU使用,您还可以获得更多其他功能,如内存使用、系统正常运行时间等。

您应该从线程MBean中了解该方法

线程CPU时间

Java虚拟机 实现可能支持测量 当前线程的CPU时间, 对于任何线程,或对于无线程

还有JTop示例应用程序,它是JDK
JDK\demo\management\JTop\src\JTop.java
或的一部分。看看:

/**
 * 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()
/**
*获取包含CPU消耗和每个线程的线程信息的线程列表
*按CPU时间排序。
*/
私有列表getThreadList()

也许或类似的库可以帮助您。

在任何给定的时刻,线程要么正在运行(100%的内核),要么不运行(0%)。 这两者之间没有任何区别。 您需要的是线程运行状态的一系列短期快照,并将其平均化。

From


你可以尝试使用。只需将webmon analyzer jar添加到项目中,即可启动采样器和TCP/IP服务器。采样器将轮询JMXAPI并将统计数据保留一段时间,然后您只需
telnet localhost 5455
即可获得这些统计数据的文本转储。非常适合制作。免责声明:我是作者,项目很旧。

hi,有没有办法使用ThreadMXBean.getCurrentCPUTime()方法mentioed获取JVM的cpu使用率(百分比)?您必须计算所有线程的cpu时间之和才能获得总cpu时间。我认为这个总数可能会有点小,因为你不能原子地查询所有线程的CPU时间。我尝试了这个方法,但似乎没有给出一个准确的值。与我在jconsole中看到的情况相比,当jconsole上的cpu使用率已经达到99%时,计算结果是65%。有java替代方案吗?你能再详细一点吗?难道你不需要解释那些被阻塞或处于定时等待状态的线程吗?我见过定时等待线程有时占用cpu周期。我的要求是,当cpu使用率超过阈值时,触发jvm进行更多线程转储,以便我们调查问题。这是不正确的,因为Java 1.5引入ThreadMXBean.getCurrentCPUTime()时,请参见@Thomas jung的答案。另外,链接的文章来自2002年。这是不正确的,因为Java 1.5引入了ThreadMXBean.getCurrentCPUTime()时,请参见@thomas jung的答案。但是Sigar确实有一些有趣的功能。Sigar也可以关闭JVM并使一切崩溃。即使是断断续续的,我认为你们在生产中也负担不起。
    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);