统计操作系统的整个系统负载占用CPU的情况

    xiaoxiao2023-11-07  138

    最近做一个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());

    }

     

    }

    }

    测试结果跟操作系统统计出来的结果几乎一样

    最新回复(0)