有没有一种跨平台的方式来测量JVM(一旦启动Java应用程序)的CPU使用情况(Windows + Unix + Mac)?我已经使用过Jconsole,但我需要的是一段Java代码,而不是一个可以监视CPU利用率的工具。我已经尝试过
ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage()
我正在使用JMX,但它并没有帮助我获得我需要的JVM特定的CPU使用情况(例如在启动服务器时),而不是系统的平均负载。
有没有一种跨平台的方式来测量JVM(一旦启动Java应用程序)的CPU使用情况(Windows + Unix + Mac)?我已经使用过Jconsole,但我需要的是一段Java代码,而不是一个可以监视CPU利用率的工具。我已经尝试过
ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage()
我正在使用JMX,但它并没有帮助我获得我需要的JVM特定的CPU使用情况(例如在启动服务器时),而不是系统的平均负载。
您应该查看来自Thread MBean的ThreadMXBean.getThreadCPUTime()方法。
线程CPU时间
Java虚拟机实现可能支持测量当前线程、任何线程或无线程的CPU时间。
还有JDK中的JTop示例应用程序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()
在任何时刻,一个线程要么正在运行(占用100%的核心),要么不在运行状态(占用0%)。 没有中间状态。 你需要的是对线程运行状态进行短期快照,并在这些快照上计算平均值。
From 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);
telnet localhost 5455
即可获取这些统计数据的文本转储。非常适合生产环境。免责声明:我是作者,该项目有点老。Java本身不提供此功能。有几个开源API可用于测量CPU使用情况。
我推荐Sigar API。除了CPU使用率外,您还可以获得更多其他功能,例如内存使用情况、系统正常运行时间等。
使用纯Java编程查询CPU使用率是不可能的。这方面没有API可用。一个建议的替代方法可能会使用Runtime.exec()
来确定JVM的进程ID(PID),调用外部的、特定于平台的命令,如ps,并解析其输出以获取所需的PID。