Использование процессора (%) MBean на Sun JVM

Вкладка "Обзор" процесса на jconsole показывает процент использования процессора. Есть ли MBean, который дает мне это значение? Какова его ObjectName?

Ответ 2

Обновление: в 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

Оба значения возвращаются как double между 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 или будущих обновлениях, поэтому вы должны решить, re готовы принять этот риск или нет.

см. https://www.java.net/community-item/hidden-java-7-features-%E2%80%93-system-and-process-cpu-load-monitoring для более.

Ответ 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;
}