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