Измерять использование ЦП JVM: java-код

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

ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage()

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

Ответ 1

Вы должны посмотреть на метод ThreadMXBean.getCurrentCPUTime() из MBean Thread.

Время процессорного времени

Виртуальная машина 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

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

Ответ 3

Из здесь

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

Ответ 4

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

См. ссылку

Ответ 5

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

Ответ 6

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