Как да получите процент на използване на процесора на ОС от 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
Не. Натоварването няма нищо общо с процента. wiki и 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
Трябва да работи на всички. Тествах го на Windows 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

Можете да използвате API на SIGAR. Той е междуплатформен (но съм го използвал само в Windows).

Javadoc е достъпен тук, а двоичните файлове са тук

Той е лицензиран съгласно условията на лиценза Apache 2.0.

person Julien    schedule 28.08.2013
comment
Благодаря! Но в javadoc на този API виждам само Получаване на общото системно процесорно време, а не използването в CPU клас. Можете ли да ме насочите къде мога да получа данни за използването на процесора? - 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