измерить загрузку процессора JVM: код Java - PullRequest
11 голосов
/ 06 мая 2011

Есть ли способ измерить загрузку процессора JVM (после запуска Java-приложения) кросс-платформенным (windows + unix + mac)? Я использовал Jconsole, но мне нужен Java-код, который делает это, а не инструмент, с помощью которого я могу контролировать загрузку процессора. Я попробовал

ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage()

с использованием JMX, но это не помогает, так как мне нужна конкретная загрузка ЦП JVM (скажем, при запуске сервера), а не средняя загрузка системы.

Ответы [ 6 ]

8 голосов
/ 06 мая 2011

Вам следует взглянуть на метод ThreadMXBean.getCurrentCPUTime () из потока MBean.

Поток процессорного времени

Виртуальная машина Java реализация может поддерживать измерение время процессора для текущего потока, для любой темы или без темы.

Существует также пример приложения JTop, которое является частью JDK jdk\demo\management\JTop\src\JTop.java или здесь . Посмотрите на:

/**
 * Get the thread list with CPU consumption and the ThreadInfo for each thread
 * sorted by the CPU time.
 */
private List<Map.Entry<Long, ThreadInfo>> getThreadList()
2 голосов
/ 31 марта 2013

С здесь

    com.sun.management.OperatingSystemMXBean operatingSystemMXBean = 
         (com.sun.management.OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
    RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
    int availableProcessors = operatingSystemMXBean.getAvailableProcessors();
    long prevUpTime = runtimeMXBean.getUptime();
    long prevProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
    double cpuUsage;
    try 
    {
        Thread.sleep(500);
    } 
    catch (Exception ignored) { }

    operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    long upTime = runtimeMXBean.getUptime();
    long processCpuTime = operatingSystemMXBean.getProcessCpuTime();
    long elapsedCpu = processCpuTime - prevProcessCpuTime;
    long elapsedTime = upTime - prevUpTime;

    cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 10000F * availableProcessors));
    System.out.println("Java CPU: " + cpuUsage);
2 голосов
/ 06 мая 2011

В любой данный момент поток либо работает (100% ядра), либо нет (0%). Между ними нет. Вам нужна кратковременная серия снимков рабочего состояния потока и усреднение по ним.

2 голосов
/ 06 мая 2011

Сама Java не предоставляет эту функцию. Есть несколько API с открытым исходным кодом, доступных для измерения загрузки процессора.
Я рекомендую Sigar API . Помимо использования процессора, вы можете получить гораздо больше других функций, таких как использование памяти, время работы системы и т. Д.

1 голос
/ 06 мая 2011

Возможно, эта или подобные библиотеки могут вам помочь.

0 голосов
/ 06 мая 2011

Программные запросы на загрузку процессора невозможны при использовании чистой Java. Для этого просто нет API. Предлагаемая альтернатива может использовать Runtime.exec() для определения идентификатора процесса (PID) JVM, вызова внешней, специфичной для платформы команды, такой как ps, и анализа ее выходных данных для интересующего PID.

Смотрите эту ссылку

...