web-dev-qa-db-ja.com

`JavaでスレッドごとのCPU使用量を監視しますか?

Javaのスレッドごとにcpu usageを判別する簡単な方法があるかどうかを確認したいと思います。ありがとう

32
awk

JConsolearchived link )はプラグインを介してこの種の情報を提供すると思います

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);
            }
        }
21
VonC

Java.lang.management.ThreadMXBean を使用します。 ThreadMXBeanを取得する方法:

 ThreadMXBean tmxb = ManagementFactory.getThreadMXBean();

次に、次のコマンドを使用して、特定のスレッドが消費している量を照会できます。

 long cpuTime = tmxb.getThreadCpuTime(aThreadID);

それが役に立てば幸い。

15
dfa

Option_1:コードレベル

あなたのビジネスロジックコード;最初の呼び出しではstart()APIを呼び出し、最後のブロックではstop()を呼び出します。そのため、現在実行中のスレッドによってロジックを実行するためのCPU時間を取得できます。次に、ログに記録します。 参考

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:プラグインを使用してレベルを監視する(jvisualvmをサポートしていないAIX IBMボックス)

コードの追加が遅れていると思われる場合は、プラグインをサポートするJConsoleを選択できます。私は this の記事に従いました。その記事からtopthreads jarをダウンロードして./jconsole -pluginpath topthreads-1.1.jarを実行します

Option_3:TOP(Shift H)+ JSTACK( 'Shif + H'をサポートするUnixマシン)を使用してレベルを監視する

this チュートリアルに従ってください。ここで、topコマンドはトップCPUスレッド(nid)を見つけるオプションを提供します。 jstack出力ファイルのnidを確認してください。

5

「TopThreads」JConsoleプラグインを試してください。参照 http://lsd.luminis.nl/top-threads-plugin-for-jconsole/

2
peter

実際、ThreadMXBeanオブジェクトは必要な機能を提供します(ただし、すべての仮想マシンに実装されているわけではありません)。

JDK 1.5には、必要なものを正確に実行するデモプログラムがありました。これは、demo/managementフォルダーにあり、JTop.Javaと呼ばれていました。

残念ながら、Java6にはありません。多分あなたはグーグルで見つけるか、JDK5をダウンロードすることができます。

1
idrosid

これはプラットフォームに依存しますが、あなたが探しているのはThreadMXBeanです: http://Java.Sun.com/j2se/1.5.0/docs/api/Java/lang /management/ThreadMXBean.html 。たとえば、getThreadUserTimeメソッドを使用して、必要なものを取得できます。プラットフォームがCPU測定をサポートしているかどうかを確認するには、isThreadCpuTimeSupported()を呼び出します。

1
Gadi