Java 獲取 CPU 佔用率
阿新 • • 發佈:2018-12-11
轉自:https://www.jianshu.com/p/015cc4805e29
最近做一個Java效能統計的問題,需要統計當前程序佔用CPU的情況,最開始使用Java MxBean來獲取:
OperatingSystemMXBean osMxBean = ManagementFactory.getOperatingSystemMXBean();
double cpu = osMxBean.getSystemLoadAverage();
但是這個方法得到的作業系統統計的整個系統負載,不能較好的反應本程序的CPU佔用情況,然後就是用一個新的方法,通過統計執行緒CPU佔用時間來做統計,具體程式碼如下:
package com.service.article; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.lang.management.ThreadMXBean; public class CPUMonitorCalc { private static CPUMonitorCalc instance = new CPUMonitorCalc(); private OperatingSystemMXBean osMxBean; private ThreadMXBean threadBean; private long preTime = System.nanoTime(); private long preUsedTime = 0; private CPUMonitorCalc() { osMxBean = ManagementFactory.getOperatingSystemMXBean(); threadBean = ManagementFactory.getThreadMXBean(); } public static CPUMonitorCalc getInstance() { return instance; } public double getProcessCpu() { long totalTime = 0; for (long id : threadBean.getAllThreadIds()) { totalTime += threadBean.getThreadCpuTime(id); } long curtime = System.nanoTime(); long usedTime = totalTime - preUsedTime; long totalPassedTime = curtime - preTime; preTime = curtime; preUsedTime = totalTime; return (((double) usedTime) / totalPassedTime / osMxBean.getAvailableProcessors()) * 100; } }
測試方法:
package com.service.article; public class ArticleApplication { public static void main(String[] args) throws Exception { for (int i = 0; i < 2; i++) { new Thread(() -> { while (true) { long bac = 1000000; bac = bac >> 1; } }).start();; } while (true) { Thread.sleep(5000); System.out.println(CPUMonitorCalc.getInstance().getProcessCpu()); } } }
測試結果跟作業系統統計出來的結果幾乎一樣。