`Мониторинг использования процессора на поток в Java? - PullRequest
30 голосов
/ 16 апреля 2009

Я хотел бы спросить, есть ли какой-нибудь простой способ определить cpu usage для потока в java. Спасибо

Ответы [ 6 ]

21 голосов
/ 16 апреля 2009

Я полагаю, что JConsole ( архивная ссылка ) действительно предоставляет такую ​​информацию через плагин

JConsole Thread CPU usage, after blogs.oracle.com/lmalventosa/resource/thread_cpu_usage.jpg

Используется ThreadMXBean getThreadCpuTime ().

Что-то вроде:

        long upTime = runtimeProxy.getUptime();
        List<Long> threadCpuTime = new ArrayList<Long>();
        for (int i = 0; i < threadIds.size(); i++) {
            long threadId = threadIds.get(i);
            if (threadId != -1) {
                threadCpuTime.add(threadProxy.getThreadCpuTime(threadId));
            } else {
                threadCpuTime.add(0L);
            }
        }
        int nCPUs = osProxy.getAvailableProcessors();
        List<Float> cpuUsageList = new ArrayList<Float>();
        if (prevUpTime > 0L && upTime > prevUpTime) {
            // elapsedTime is in ms
            long elapsedTime = upTime - prevUpTime;
            for (int i = 0; i < threadIds.size(); i++) {
                // elapsedCpu is in ns
                long elapsedCpu = threadCpuTime.get(i) - prevThreadCpuTime.get(i);
                // cpuUsage could go higher than 100% because elapsedTime
                // and elapsedCpu are not fetched simultaneously. Limit to
                // 99% to avoid Chart showing a scale from 0% to 200%.
                float cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 1000000F * nCPUs));
                cpuUsageList.add(cpuUsage);
            }
        }
15 голосов
/ 16 апреля 2009

с помощью java.lang.management.ThreadMXBean . Как получить ThreadMXBean:

 ThreadMXBean tmxb = ManagementFactory.getThreadMXBean();

тогда вы можете запросить, сколько потребляет конкретный поток, используя:

 long cpuTime = tmxb.getThreadCpuTime(aThreadID);

Надеюсь, это поможет.

5 голосов
/ 09 февраля 2015

Option_1: уровень кода

В коде вашей бизнес-логики; в начале вызова API start () и в блоке finally вызова stop (). Так что вы получите процессорное время для выполнения вашей логики текущим запущенным потоком. Тогда войдите. Ссылка .

class CPUTimer 
{
    private long _startTime = 0l;

    public void start ()
    {
        _startTime = getCpuTimeInMillis();
    }


    public long stop ()
    {
        long result = (getCpuTimeInMillis() - _startTime);
        _startTime = 0l;
        return result;
    }

    public boolean isRunning ()
    {
        return _startTime != 0l;
    }

    /** thread CPU time in milliseconds. */
    private long getCpuTimeInMillis ()
    {
        ThreadMXBean bean = ManagementFactory.getThreadMXBean();
        return bean.isCurrentThreadCpuTimeSupported() ? bean.getCurrentThreadCpuTime()/1000000: 0L;
    }
}

Option_2: мониторинг уровня с помощью плагинов (AIX IBM box, не поддерживающий jvisualvm)

Если вы считаете, что добавление кода задерживается, вы можете предпочесть JConsole с поддержкой плагинов. Я следовал за этой статьей. Загрузите банку topthreads из этой статьи и запустите ./jconsole -pluginpath topthreads-1.1.jar

Option_3: контролировать уровень с помощью TOP (смещение H) + JSTACK (Unix-машина с поддержкой 'Shif + H')

Следуйте этому учебнику , где команда top даст возможность найти верхнюю нить ЦП (nid). Возьмите эту проверку nid в выходном файле jstack.

2 голосов
/ 26 января 2011

Попробуйте плагин "TopThreads" JConsole. Смотри http://lsd.luminis.nl/top-threads-plugin-for-jconsole/

1 голос
/ 16 апреля 2009

Действительно, объект ThreadMXBean обеспечивает необходимую вам функциональность (однако он может быть реализован не на всех виртуальных машинах).

В JDK 1.5 была демонстрационная программа, делающая именно то, что вам нужно. Он был в папке demo / management и назывался JTop.java

К сожалению, его нет в Java6. Может быть, вы можете найти на Google или скачать JDK5.

1 голос
/ 16 апреля 2009

Хотя это зависит от платформы, я полагаю, что вы ищете ThreadMXBean: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/ThreadMXBean.html. Вы можете использовать метод getThreadUserTime, например, чтобы получить то, что вам нужно. Чтобы проверить, поддерживает ли ваша платформа измерение ЦП, вы можете вызвать isThreadCpuTimeSupported ().

...