Мониторинг использования 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