最近做一个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());
-
}
-
}
-
}
测试结果跟操作系统统计出来的结果几乎一样