Как получить процент использования ЦП ОС из java

Я хочу рассчитать процент использования ЦП ОС из java-кода.

  1. Есть несколько способов найти его с помощью команды unix [например, используя mpstat, /proc/stat и т. д...] и используйте его из Runtime.getRuntime().exec

Но я не хочу использовать системные вызовы.

Я пробовал ManagementFactory.getOperatingSystemMXBean()

OperatingSystemMXBean osBean =
         (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
System.out.println(osBean.getSystemLoadAverage());

Но это дает нагрузку на процессор, но не использование процессора. Можно ли как-то найти процент использования?


person G.S    schedule 28.08.2013    source источник
comment
Можете ли вы дать ссылку на Javadoc для OperatingSystemMXBean, пожалуйста? Процент рассчитывается от нагрузки или наоборот? Я не знаю, но может быть.   -  person Freiheit    schedule 28.08.2013
comment
Нет. Загрузка не имеет ничего общего с процентами. вики и javadoc   -  person G.S    schedule 28.08.2013


Ответы (2)


В Java 7 вы можете получить это так:

public static double getProcessCpuLoad() throws Exception {

    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();

    // usually takes a couple of seconds before we get real values
    if (value == -1.0)      return Double.NaN;
    // returns a percentage value with 1 decimal point precision
    return ((int)(value * 1000) / 10.0);
}
person isapir    schedule 22.02.2014
comment
Это работает только на определенных операционных системах? При запуске Java 7u15 в 64-битной Windows 7 возвращается NaN, так как value является отрицательным. - person FThompson; 23.02.2014
comment
Должно работать на всех. Я протестировал его на Window 7 Java7u51 64bit, и через несколько секунд он отлично работает. Первые несколько секунд возвращают -1.0, потому что для инициализации некоторых объектов/значений требуется некоторое время. - person isapir; 23.02.2014
comment
Интересно, что на моей машине требуется около одной секунды, чтобы загрузка ЦП стала фактическим значением. Спасибо за разъяснения. +1 - person FThompson; 23.02.2014
comment
Я добавил комментарий в код, чтобы прояснить для будущих пользователей, которые могут не читать комментарии здесь. - person isapir; 23.02.2014
comment
@Igal спасибо за ответ. Я использую windows-7 + java 7u45, но мне все равно не повезло. Кстати, список атрибутов, который вы указали в коде, — ProcessCpuLoad. Это загрузка ЦП или использование ЦП? - person G.S; 24.02.2014
comment
ProcessCpuLoad — это % загрузки ЦП этой JVM для системы. есть еще SystemCpuLoad, который дает нагрузку на всю систему. вы пытались вызвать его в цикле? Я заметил, что первые несколько вызовов возвращают -1.0 - person isapir; 24.02.2014
comment
Он всегда возвращает NaN в Mac OS X, даже через несколько минут. - person TheDoctor; 05.08.2014
comment
Этот работал как шарм! Я перепроверил с помощью jconsole, и они дали одинаковое значение (более или менее), - person Lynx777; 09.05.2016
comment
(значение * 1000) / 10,0) == значение * 100 - person Raheel; 17.07.2017
comment
@Raheel на самом деле нет. при делении на 10.0 вы конвертируете int в double. - person isapir; 18.07.2017
comment
Вы поймете это, когда подсчитаете эту статистику... :-) - person acthota; 13.03.2019

Вы можете использовать SIGAR API. Это кроссплатформенный (но я использую его только в Windows).

Javadoc доступен здесь, а двоичные файлы здесь

Он распространяется в соответствии с условиями лицензии Apache 2.0.

person Julien    schedule 28.08.2013
comment
Спасибо! Но в javadoc этого API я вижу только получение общего времени процессора системы, а не использование в классе ЦП. Не могли бы вы указать мне, где я могу получить загрузку процессора? - person G.S; 28.08.2013
comment
Если вы загрузили Sigar с SourceForge, вы должны найти несколько доступных примеров по адресу hyperic-sigar-1.6.4\bindings\java\examples\. Я думаю, что CpuInfo.java или Top.java могут быть тем, что вы ищете. - person Julien; 28.08.2013
comment
Похоже, что ничего более позднего, чем Ubuntu 9, не сертифицировано для SIGAR API в соответствии с сайтом. Это должно быть проблемой? - person Shivaji_Vidhale; 06.06.2015
comment
мы также должны учитывать, что SIGAR приводит к сбою JVM. Строго НЕТ НЕТ для производственной среды. - person AKS; 14.06.2017
comment
Ссылка SIGAR мертва. Проект тоже умер? А может быть приобретена vmware, судя по второй ссылке - person Fractaly; 12.08.2019