2010-06-15 128 views

回答

1

ManagementFactory中似乎没有直接的MBean。最接近的是http://java.sun.com/javase/6/docs/api/java/lang/management/OperatingSystemMXBean.html#getSystemLoadAverage(),它可以用来计算整个系统使用的CPU。

但是this URL has suggested a method基于JConsole的

+0

不是(简单)的解决方案,我想,但似乎是唯一的出路。 – tuler 2010-06-16 14:40:43

+1

注意,演员阵容是com.sun.management.OperatingSystemMXBean! – 2013-09-10 12:15:42

+0

您给Java 7的作品的URL。'com.sun.management.OperatingSystemMXBean'不能用Java 6访问... – Matthieu 2015-05-14 12:13:26

17

更新的源代码:在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

+0

注意:这些方法*在Java *中不可用* – Brandon 2014-05-13 14:28:49

+5

正确。这就是为什么我在我的答案中写了两次:在Java 7中... – isapir 2014-05-13 16:43:35

0

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