純粋なJavaを使用してCPU使用率を監視する方法はありますか?
Kgiannakakisがリンクした記事のコメントには宝石があります:
JavaSysMonはプロセスを管理し、クロスプラットフォームで役立つシステムパフォーマンスメトリックを報告します。これは、プロセスを強制終了する機能を備えた、UNIXの「top」コマンドのクロスプラットフォームバージョンと考えることができます。単一のJARファイル/。の形式で提供されます。
-Windows、Mac OS X、Linux、およびSolarisで動作します。
Jmx mbeansを使用するのはどうですか?
final OperatingSystemMXBean myOsBean=
ManagementFactory.getOperatingSystemMXBean();
double load = myOsBean.getSystemLoadAverage();
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;
}
これは、純粋なJavaを使用しては不可能です。いくつかのアイデアについては、これを参照してください 記事 。
スタックしている場合は、バックグラウンドスレッドで断続的なbogomips計算機を実行し、その結果を平滑化および正規化することで、CPUの可用性を「感知」することができます。 ...一撃の価値はありません:?
linuxを使用している場合-jconsole
を使用するだけです-Javaメモリ管理のすべてのトラックを取得します