轉自: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());
}
}
}
測試結果跟操作系統統計出來的結果幾乎一樣。