【问题标题】:CPU Usage (%) MBean on Sun JVMSun JVM 上的 CPU 使用率 (%) MBean
【发布时间】:2011-03-03 22:58:17
【问题描述】:

jconsole 上进程的概览选项卡显示 CPU 使用百分比。有没有给我这个值的 MBean?它的 ObjectName 是什么?

【问题讨论】:

    标签: jvm cpu-usage


    【解决方案1】:

    更新:在 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 或将来的更新中不可用,因此您应该决定是否是否愿意承担风险。

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

    【讨论】:

    • 注意:这些方法在 Java 6 中可用。
    【解决方案2】:

    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!
    • 您提供的 URL 适用于 Java 7。com.sun.management.OperatingSystemMXBean 无法通过 Java 6 访问...
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果您使用的是基于 UNIX 的操作系统,那么它会容易得多

      final OperatingSystemMXBean mxBean = ManagementFactory.getOperatingSystemMXBean();
      if (mxBean instanceof UnixOperatingSystemMXBean) {
        return ((UnixOperatingSystemMXBean) mxBean).getSystemCpuLoad() * 100.0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多