有没有办法测量JVM的CPU使用率(一旦启动java应用程序)跨平台(windows + unix + mac)? 我使用过Jconsole,但我需要的是一个执行此操作的java代码,而不是一个可以监视CPU利用率的工具。 我试过了
ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage()
使用JMX,但它没有帮助,因为我需要的是JVM的特定CPU使用率(比如当我启动服务器时),而不是系统负载平均值。
有没有办法测量JVM的CPU使用率(一旦启动java应用程序)跨平台(windows + unix + mac)? 我使用过Jconsole,但我需要的是一个执行此操作的java代码,而不是一个可以监视CPU利用率的工具。 我试过了
ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage()
使用JMX,但它没有帮助,因为我需要的是JVM的特定CPU使用率(比如当我启动服务器时),而不是系统负载平均值。
你应该看一下 ThreadMXBean.getCurrentCPUTime() Thread 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()
你应该看一下 ThreadMXBean.getCurrentCPUTime() Thread 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()
Java本身不提供此功能。有几个开源API可用于衡量CPU使用率。
我建议 Sigar API。除CPU使用外,您还可以获得更多其他功能,如内存使用,系统正常运行时间等。
从 这里
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);
使用纯Java无法以编程方式查询CPU使用情况。根本就没有API。建议的替代方案可以使用 Runtime.exec()
确定JVM的进程ID(PID),调用外部的,特定于平台的命令,如ps,并解析其输出的感兴趣的PID。
在任何给定的时刻,线程正在运行(100%的核心)或不运行(0%)。 中间没有。 您需要的是线程运行状态的一系列短期快照,并对其进行平均。
也许 这个 或类似的图书馆可以帮助你。