有没有办法测量JVM的CPU使用率(一旦启动java应用程序)跨平台(windows + unix + mac)? 我使用过Jconsole,但我需要的是一个执行此操作的java代码,而不是一个可以监视CPU利用率的工具。 我试过了
ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage()
使用JMX,但它没有帮助,因为我需要的是JVM的特定CPU使用率(比如当我启动服务器时),而不是系统负载平均值。
答案 0 :(得分:8)
您应该查看Thread MBean中的ThreadMXBean.getCurrentCPUTime()方法。
线程CPU时间
Java虚拟机 实施可能支持测量 当前线程的CPU时间, 任何线程,或没有线程。
还有JTOP示例应用程序是JDK jdk\demo\management\JTop\src\JTop.java
或here的一部分。看看:
/**
* 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。
答案 6 :(得分:0)
您可以尝试使用https://github.com/mvysny/webmon。您只需将webmon-analyzer jar添加到您的项目中,然后将启动采样器和TCP / IP服务器。采样器将轮询JMX API,并将统计信息保留一段时间,然后您可以简单地telnet localhost 5455
来获取这些统计信息的文本转储。很棒的制作。免责声明:我是作者,项目很旧。