Sun JVM上MBean的CPU使用率(%)
jconsole上进程的overview选项卡显示了CPU使用率百分比。是否有一个MBean给我这个值?它的对象名是什么?ManagementFactory中似乎没有直接的MBean。最接近的是可以用来计算整个系统使用的CPUSun JVM上MBean的CPU使用率(%),jvm,cpu-usage,Jvm,Cpu Usage,jconsole上进程的overview选项卡显示了CPU使用率百分比。是否有一个MBean给我这个值?它的对象名是什么?ManagementFactory中似乎没有直接的MBean。最接近的是可以用来计算整个系统使用的CPU 然而,基于jconsole的源代码,更新:在Java 7中,您可以这样做: public static double getProcessCpuLoad() throws MalformedObjectNameException, ReflectionException,
然而,基于jconsole的源代码,更新:在Java 7中,您可以这样做:
public static double getProcessCpuLoad() throws MalformedObjectNameException, ReflectionException, InstanceNotFoundException {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName name = ObjectName.getInstance("java.lang:type=OperatingSystem");
AttributeList list = mbs.getAttributes(name, new String[]{ "ProcessCpuLoad" });
if (list.isEmpty()) return Double.NaN;
Attribute att = (Attribute)list.get(0);
Double value = (Double)att.getValue();
if (value == -1.0) return Double.NaN;
return ((int)(value * 1000) / 10.0); // returns a percentage value with 1 decimal point precision
}
-----原始答案如下-----
在Java 7中,您可以使用com.sun.management.OperatingSystemMXBean
的隐藏方法:
getProcessCpuLoad() // returns the CPU usage of the JVM
getSystemCpuLoad() // returns the CPU usage of the whole system
这两个值都以0.0和1.0之间的双精度形式返回,因此只需乘以100即可得到一个百分比
com.sun.management.OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
System.out.println(osBean.getProcessCpuLoad() * 100);
System.out.println(osBean.getSystemCpuLoad() * 100);
由于这些方法是隐藏的、未记录的、存在于com.sun.management.OperatingSystemMXBean
包中的方法,而不存在于java.lang.management.OperatingSystemMXBean
中,因此它们可能在某些JVM或将来的更新中不可用,因此您应该决定是否愿意承担这种风险
有关更多信息,请参阅。我从internet修改了一段代码,如下所示,然后对其进行了测试,结果几乎与linux ps命令的结果一致 /**下面是代码*/
public float getCpuUsed() {
/** get a MXBean */
com.sun.management.OperatingSystemMXBean osMXBean =
(com.sun.management.OperatingSystemMXBean)
ManagementFactory.getOperatingSystemMXBean();
/** set old timestamp values */
long previousJvmProcessCpuTime = osMXBean.getProcessCpuTime();
int sleepTime = 350;
/** sleep for a while to use to calculate */
try {
TimeUnit.MILLISECONDS.sleep(sleepTime);
} catch (InterruptedException e) {
logger.error("InterruptedException occurred while MemoryCollector sleeping...");
}
/** elapsed process time is in nanoseconds */
long elapsedProcessCpuTime = osMXBean.getProcessCpuTime() - previousJvmProcessCpuTime;
/** elapsed uptime is in milliseconds */
long elapsedJvmUptime = sleepTime ;
/** total jvm uptime on all the available processors */
//long totalElapsedJvmUptime = elapsedJvmUptime * osMXBean.getAvailableProcessors() ;
long totalElapsedJvmUptime = elapsedJvmUptime;
//System.out.println("echo cpu processors num " + osMXBean.getAvailableProcessors());
/** calculate cpu usage as a percentage value
to convert nanoseconds to milliseconds divide it by 1000000 and to get a percentage multiply it by 100 */
float cpuUsage = elapsedProcessCpuTime / (totalElapsedJvmUptime * 10000F);
return (float)(Math.round(cpuUsage*10)/10);
}
如果您使用的是基于UNIX的操作系统,那么就容易多了
final OperatingSystemMXBean mxBean = ManagementFactory.getOperatingSystemMXBean();
if (mxBean instanceof UnixOperatingSystemMXBean) {
return ((UnixOperatingSystemMXBean) mxBean).getSystemCpuLoad() * 100.0;
}
这不是我想要的(简单的)解决方案,但似乎是唯一的方法。请注意,演员阵容是com.sun.management.OperatingSystemMXBean!您提供的URL适用于Java 7
com.sun.management.OperatingSystemMXBean
在Java 6中不可访问…注意:这些方法在Java 6中不可用。