2013-11-05 44 views
7

Javaを使用して、現在実行中のJava仮想マシンが使用するCPUの割合を取得しようとしています。私の研究は、com.sun.management.OperatingSystemMXBeanクラスの使用を指摘しています。OperatingSystemMXBeanを使用してCPU使用率を取得する

import java.lang.management.ManagementFactory; 
import com.sun.management.OperatingSystemMXBean; 


public class TestClass { 

public static void main (String[] args) { 
    OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); 

    System.out.println(bean.getProcessCpuLoad()); 
    System.out.println(bean.getSystemCpuLoad()); 

    } 

} 

二台のマシン上でこれをテストした後、私は両方の呼び出しのための-1.0の結果を得て停止することはできません。オンラインの例に続いて、私は次のように書きました。私は64ビットと32ビットのJava 7と6の両方をさまざまな方法で使ってこのコードを実行しようとしました。それでも、私が得るすべては-1.0according to the Javadocsのプリントアウト、私はここで行うには他に何を知らない

All values betweens 0.0 and 1.0 are possible depending of the activities going on in the system. If the system recent cpu usage is not available, the method returns a negative value.

です。 CPU負荷を得ることは非常に重要です。Sigarのような別のライブラリを使用しないでください。誰もがこの勧告を持っているか、あるいはこの問題の洞察を持っていますか?

答えて

21

誰かを助けることができる場合に備えて、私自身の質問に答えるだけです。

私がやっていたことは技術的には正解でしたが、私はOperatingSystemMXBeanにCPU使用率情報を収集するのに十分な時間を与えていませんでした。 JVMは実際にはCPU使用率情報を収集する前に数秒間実行していなければなりません。そして、リフレッシュ解決は実装に依存しているように見えます。

次のように変更してコードを実行すると、私のマシン上で〜2秒後に使用情報を生成するために開始します:

public static void main(String[] args) { 
    OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) ManagementFactory 
      .getOperatingSystemMXBean(); 

    while (true) { 
     System.out.println(bean.getProcessCpuLoad()); 
     System.out.println(bean.getSystemCpuLoad()); 
    } 

} 

うまくいけば、これは、この答えを誰か

+0

感謝を助けることができますが、私は実行していることを観察しましたこのコードは、CPU使用率を30〜40%向上させます。これは、このコードを実行するたびにCPU使用率が増加することを意味します。 –

+3

@Shashankこのコードは、CPU使用率情報の取得の遅れを示すためのものです。実際のシステムでは、この呼び出しを無限ループで行うべきではありません。アプリケーションが実行されてから数分後には、ユースケースごとに1回だけで十分です。 – Kon

+0

このコードを1〜2秒間実行しても、CPU使用率が増加します。 –

関連する問題