JNIを使用せずにJavaで現在のCPU負荷を取得する方法はありますか?JavaからのCPU負荷
答えて
ManagementFactory
を使用してOperatingSystemMXBean
を取得し、getSystemLoadAverage()
を呼び出してください。
Linuxでは、/ proc/loadavgファイルを読み込むことができます。最初の3つの値は負荷平均を表します。 WindowsではおそらくJNIに固執する必要があります。
これにはJNIが関係しますが、HypericのSigarと呼ばれるGPLライブラリがあり、主要なプラットフォームすべてにこの情報を提供します。また、ディスク使用率などのOS依存の統計情報もたくさんあります。それは私たちにとって素晴らしい仕事です。
JRockit JVMを使用している場合は、JMAPIを使用できます。 JDK 1.4,1.5,1.6で動作します。
System.out.println("Total CPU-usage:" + JVMFactory.getJVM().getMachine().getCPULoad());
System.out.println("Total JVM-load :" + JVMFactory.getJVM().getJVMLoad());
for(Iterator it = JVMFactory.getJVM().getMachine().getCPUs().iterator(); it.hasNext();)
{
CPU cpu = (CPU)it.next();
System.out.println("CPU Description: " + cpu.getDescription());
System.out.println("CPU Clock Frequency: " + cpu.getClockFrequency());
System.out.println("CPU Load: " + cpu.getLoad());
System.out.println();
}
getSystemLoadAverage()あなたは時間の1分にわたり価値を提供します(毎秒リフレッシュし)、全体的なオペレーティングシステムのためにこの値を与えます。各スレッドを別々に監視することにより、よりリアルタイムの概要を把握する必要があります。重要なのは、監視のリフレッシュ間隔にも注意してください。値を確認する頻度が増え、指定された時刻にもっと正確になります。ミリ秒ごとに実行すると、通常は0または100(またはそこにあるCPUの数によって異なります)。しかし、時間枠(例えば1秒)を許せば、この期間に平均してより有益な結果が得られます。また、1つのスレッドだけが複数のCPU(コア)を占有する可能性は非常に低いことに注意することが重要です。 CPUあたりAvarage負荷(コア) -
- getTotalUsage():実装後
は、3つの方法を使用することができ
getUsageByThread(スレッドt) - 指定されたスレッドによる合計負荷
import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.lang.management.ThreadMXBean; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class MonitoringThread extends Thread { private long refreshInterval; private boolean stopped; private Map<Long, ThreadTime> threadTimeMap = new HashMap<Long, ThreadTime>(); private ThreadMXBean threadBean = ManagementFactory.getThreadMXBean(); private OperatingSystemMXBean opBean = ManagementFactory.getOperatingSystemMXBean(); public MonitoringThread(long refreshInterval) { this.refreshInterval = refreshInterval; setName("MonitoringThread"); start(); } @Override public void run() { while(!stopped) { Set<Long> mappedIds; synchronized (threadTimeMap) { mappedIds = new HashSet<Long>(threadTimeMap.keySet()); } long[] allThreadIds = threadBean.getAllThreadIds(); removeDeadThreads(mappedIds, allThreadIds); mapNewThreads(allThreadIds); Collection<ThreadTime> values; synchronized (threadTimeMap) { values = new HashSet<ThreadTime>(threadTimeMap.values()); } for (ThreadTime threadTime : values) { synchronized (threadTime) { threadTime.setCurrent(threadBean.getThreadCpuTime(threadTime.getId())); } } try { Thread.sleep(refreshInterval); } catch (InterruptedException e) { throw new RuntimeException(e); } for (ThreadTime threadTime : values) { synchronized (threadTime) { threadTime.setLast(threadTime.getCurrent()); } } } } private void mapNewThreads(long[] allThreadIds) { for (long id : allThreadIds) { synchronized (threadTimeMap) { if(!threadTimeMap.containsKey(id)) threadTimeMap.put(id, new ThreadTime(id)); } } } private void removeDeadThreads(Set<Long> mappedIds, long[] allThreadIds) { outer: for (long id1 : mappedIds) { for (long id2 : allThreadIds) { if(id1 == id2) continue outer; } synchronized (threadTimeMap) { threadTimeMap.remove(id1); } } } public void stopMonitor() { this.stopped = true; } public double getTotalUsage() { Collection<ThreadTime> values; synchronized (threadTimeMap) { values = new HashSet<ThreadTime>(threadTimeMap.values()); } double usage = 0D; for (ThreadTime threadTime : values) { synchronized (threadTime) { usage += (threadTime.getCurrent() - threadTime.getLast())/(refreshInterval * 10000); } } return usage; } public double getAvarageUsagePerCPU() { return getTotalUsage()/opBean.getAvailableProcessors(); } public double getUsageByThread(Thread t) { ThreadTime info; synchronized (threadTimeMap) { info = threadTimeMap.get(t.getId()); } double usage = 0D; if(info != null) { synchronized (info) { usage = (info.getCurrent() - info.getLast())/(refreshInterval * 10000); } } return usage; } static class ThreadTime { private long id; private long last; private long current; public ThreadTime(long id) { this.id = id; } public long getId() { return id; } public long getLast() { return last; } public void setLast(long last) { this.last = last; } public long getCurrent() { return current; } public void setCurrent(long current) { this.current = current; } } }
- 1. JavaソケットリスナーCPU負荷100%
- 2. CPU高負荷()
- 3. Php7.0-fpm高負荷CPU
- 4. CPU高負荷とフリーRAM
- 5. Linux CPU /メモリ負荷グラフ
- 6. 実行中のプロセスのCPU負荷
- 7. のXcode 8.3 - SourceKitService CPUの95%+負荷
- 8. このようなCPU負荷の高い原因(MySQLから)
- 9. I/Oバウンド操作とCPU負荷操作のJavaスレッド同期
- 10. スクリプト - CPU負荷を確認する(Python)
- 11. IIS CPU負荷が高い:GetMetaDataInternalInterfaceFromPublic + 0x935c
- 12. Javaクライアント/サーバアプリケーションの負荷テスト
- 13. CPU負荷の高いタスクの子プロセスですか?
- 14. slither.ioはCPUに負荷をかけますか?
- 15. boost :: posix_time :: microsec_clockはCPUに負荷をかけますか?
- 16. 過負荷デフォルトインタフェースメソッドJavaで8
- 17. システム負荷とユーザー負荷
- 18. htopコマンドからコアのCPU負荷を抽出する方法は?
- 19. スレッドを生成してCPUに負荷をかける
- 20. SNMP経由でESXI 5.1からCPU負荷平均を集める
- 21. 負荷テストツールの負荷テスト機能
- 22. Contikiの複数のプロセスが負荷CPUで作成する
- 23. 異なるマシンでのCPU負荷の検出
- 24. 低CPU負荷によるAzure VMSSインスタンスの自動シャットダウン
- 25. ASP.NET:無負荷時のCPU使用率が高い
- 26. LinuxでCPU負荷を得るためのC API
- 27. ESとCassandraのCPU負荷が非常に高い
- 28. レンダリングループのCPU負荷が非常に高い
- 29. 重いCPU負荷でオーディオの遅れを防ぐ
- 30. リモートシステムのCPU負荷を見つける方法
私はこれは、Windows XPで動作しないかなり確信しています。 –