web-dev-qa-db-ja.com

java CPU使用率の監視

純粋なJavaを使用してCPU使用率を監視する方法はありますか?

17
shamkovich

Kgiannakakisがリンクした記事のコメントには宝石があります:

javasysmon

JavaSysMonはプロセスを管理し、クロスプラットフォームで役立つシステムパフォーマンスメトリックを報告します。これは、プロセスを強制終了する機能を備えた、UNIXの「top」コマンドのクロスプラットフォームバージョンと考えることができます。単一のJARファイル/。の形式で提供されます。

-Windows、Mac OS X、Linux、およびSolarisで動作します。

10
strainer

Jmx mbeansを使用するのはどうですか?

final OperatingSystemMXBean myOsBean= 
            ManagementFactory.getOperatingSystemMXBean();
double load = myOsBean.getSystemLoadAverage();
7
baskin

can jMXBeanを使用してCPU負荷を計算します。これは、システム全体の負荷ではなく、JavaプログラムのCPU負荷を測定することに注意してください(質問ではどちらを指定していませんでした)

初期化:

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

次に、ループとして(アプリケーションがループを使用すると仮定します。そうでない場合、CPU使用率を測定するポイントは何ですか?)これを使用します。

    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.6ms未満かかる場合(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;
    }
6
Mark Jeronimus

これは、純粋なJavaを使用しては不可能です。いくつかのアイデアについては、これを参照してください 記事

1
kgiannakakis

スタックしている場合は、バックグラウンドスレッドで断続的なbogomips計算機を実行し、その結果を平滑化および正規化することで、CPUの可用性を「感知」することができます。 ...一撃の価値はありません:?

1
strainer

linuxを使用している場合-jconsoleを使用するだけです-Javaメモリ管理のすべてのトラックを取得します

0
Devendar