現在実行中の Java 仮想マシンで使用されている CPU の割合を Java を使用して取得しようとしています。調査の結果、com.sun.management.OperatingSystemMXBean
クラスを使用する必要があることがわかりました。オンラインの例に従って、次のように記述しました。
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());
}
}
これを2台のマシンでテストしたところ、どちらの呼び出しでも結果が返ってきます-1.0
。Java 7と6の64ビット版と32ビット版の両方でこのコードを実行してみましたが、それでも、次のような出力しか得られません-1.0
。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 などの別のライブラリの使用は避けたいと思います。この問題に関して、何か推奨事項や知見をお持ちの方はいらっしゃいますか?
ベストアンサー1
誰かの役に立つかもしれないので、自分の質問に答えるだけです。
私が行っていたことは技術的には正しかったのですが、OperatingSystemMXBean
CPU 使用率情報を収集するのに十分な時間を与えていませんでした。CPU 使用率情報を収集するには、JVM が実際に数秒間実行されている必要があり、その後の更新解像度は実装に依存するようです。
次のように変更したコードを実行すると、私のマシンでは約 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());
}
}
これが誰かの助けになれば幸いです