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