【发布时间】:2011-03-03 22:58:17
【问题描述】:
jconsole 上进程的概览选项卡显示 CPU 使用百分比。有没有给我这个值的 MBean?它的 ObjectName 是什么?
【问题讨论】:
jconsole 上进程的概览选项卡显示 CPU 使用百分比。有没有给我这个值的 MBean?它的 ObjectName 是什么?
【问题讨论】:
更新:在 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 或将来的更新中不可用,因此您应该决定是否是否愿意承担风险。
【讨论】:
ManagementFactory 中似乎没有直接的 MBean。最接近的是http://java.sun.com/javase/6/docs/api/java/lang/management/OperatingSystemMXBean.html#getSystemLoadAverage(),可以用来计算整个系统使用的CPU。
不过this URL has suggested a method基于jconsole的源码
【讨论】:
com.sun.management.OperatingSystemMXBean 无法通过 Java 6 访问...
我从互联网上修改了一个代码,就像这样,然后我测试了它,结果几乎与 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;
}
【讨论】: