Sun JVM 上的 CPU 使用率 (%) MBean

14

jconsole的进程概览选项卡显示了CPU使用百分比。是否有一个MBean可以提供这个值?它的ObjectName是什么?

4个回答

22

更新:在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之间的double形式返回,因此只需将其乘以100即可获得百分比。

com.sun.management.OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
System.out.println(osBean.getProcessCpuLoad() * 100);
System.out.println(osBean.getSystemCpuLoad()  * 100);

由于这些方法被隐藏且未记录在java.lang.management.OperatingSystemMXBean中,而是存在于 com.sun.management.OperatingSystemMXBean包中,因此有可能在某些JVM或将来的更新中无法使用,所以您需要决定是否愿意承担这个风险。

更多信息请参见https://www.java.net/community-item/hidden-java-7-features-%E2%80%93-system-and-process-cpu-load-monitoring


注意:这些方法在Java 6中不可用 - Brandon
由于某种原因,您的第一个示例给出的值与com.sun.management.OperatingSystemMXBean::getProcessCpuLoad不同。示例中的值大约是后者的100倍。对此有何见解? - ALEXANDER KONSTANTINOV

2

不是我想要的(简单)解决方案,但似乎是唯一的方法。 - tuler
1
请注意,强制转换是针对com.sun.management.OperatingSystemMXBean的! - Roel Spilker
您提供的URL适用于Java 7。com.sun.management.OperatingSystemMXBean在Java 6中不可访问... - Matthieu

1
我从互联网上修改了一段代码,就像这样,然后我测试了一下,结果几乎与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);
}

1
如果您使用的是基于UNIX的操作系统,那么就容易得多。
final OperatingSystemMXBean mxBean = ManagementFactory.getOperatingSystemMXBean();
if (mxBean instanceof UnixOperatingSystemMXBean) {
  return ((UnixOperatingSystemMXBean) mxBean).getSystemCpuLoad() * 100.0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接