Измерять использование ЦП 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%).
Между ними нет.
То, что вам нужно, это кратковременная серия снимков состояния потока и среднее значение по ним.