Мониторинг использования java cpu
Есть ли способ контролировать использование ЦП с использованием чистой Java?
Ответы
Ответ 1
В комментариях к статье есть жемчужина, на которую ссылается kgiannakakis:
javasysmon
JavaSysMon управляет процессами и предоставляет полезные кроссплатформенные метрики производительности системы. Вы можете думать об этом как о кроссплатформенной версии верхней команды UNIX вместе с возможностью уничтожать процессы. Он поставляется в виде одного файла JAR/..
-works в Windows, Mac OS X, Linux и Solaris.
Ответ 2
Как насчет использования jmx mbeans?
final OperatingSystemMXBean myOsBean=
ManagementFactory.getOperatingSystemMXBean();
double load = myOsBean.getSystemLoadAverage();
Ответ 3
Вы можете использовать jMX beans для вычисления загрузки ЦП. Обратите внимание, что это измеряет загрузку процессора вашей Java-программы, а не общую загрузку системы. (вопрос не указал, какой)
Initialize:
ThreadMXBean newBean = ManagementFactory.getThreadMXBean();
try
{
if (this.newBean.isThreadCpuTimeSupported())
this.newBean.setThreadCpuTimeEnabled(true);
else
throw new AccessControlException("");
}
catch (AccessControlException e)
{
System.out.println("CPU Usage monitoring is not available!");
System.exit(0);
}
Затем, как ваш цикл (если ваше приложение использует цикл, в противном случае, что точка в измерении использования ЦП?), используйте это:
long lastTime = System.nanoTime();
long lastThreadTime = newBean.getCurrentThreadCpuTime();
while (true)
{
// Do something that takes at least 10ms (on windows)
try
{
int j = 0;
for (int i = 0; i < 20000000; i++)
j = (j + i) * j / 2;
Thread.sleep(100);
}
catch (InterruptedException e)
{
}
// Calculate coarse CPU usage:
long time = System.nanoTime();
long threadTime = newBean.getCurrentThreadCpuTime();
double load = (threadTime - lastThreadTime) / (double)(time - lastTime);
System.out.println((float)load);
// For next iteration.
lastTime = time;
lastThreadTime = threadTime;
}
Вам нужно использовать двойную точность, потому что long не подходит для поплавка (хотя он может работать 99.9999999999999999% от времени)
Если "что-то", которое вы делаете, занимает менее 1,6 мс (Windows), тогда возвращаемое значение даже не увеличится, и вы будете постоянно измерять 0% CPU ошибочно.
Потому что getCurrentThreadCpuTime
ОЧЕНЬ неточен (с задержками менее 100 мс), сглаживание помогает много:
long lastTime = System.nanoTime();
long lastThreadTime = newBean.getCurrentThreadCpuTime();
float smoothLoad = 0;
while (true)
{
// Do something that takes at least 10ms (on windows)
try
{
int j = 0;
for (int i = 0; i < 2000000; i++)
j = (j + i) * j / 2;
Thread.sleep(10);
}
catch (InterruptedException e)
{
}
// Calculate coarse CPU usage:
long time = System.nanoTime();
long threadTime = newBean.getCurrentThreadCpuTime();
double load = (threadTime - lastThreadTime) / (double)(time - lastTime);
// Smooth it.
smoothLoad += (load - smoothLoad) * 0.1; // damping factor, lower means less responsive, 1 means no smoothing.
System.out.println(smoothLoad);
// For next iteration.
lastTime = time;
lastThreadTime = threadTime;
}
Ответ 4
Это невозможно с использованием чистой Java. См. статью для некоторых идей.
Ответ 5
Возможно, если вы застряли, вы можете "почувствовать" доступность cpu, запустив прерывистый калькулятор богомиксов в фоновом потоке и сглаживая и нормализуя его результаты.
... стоит выстрел нет:?
Ответ 6
если вы используете linux - просто используйте jconsole
- вы получите весь трек управления памятью java