当前位置:   article > 正文

Java中获取CPU与内存利用率_java计算android cpu使用率

java计算android cpu使用率

使用说明

代码示例

 

当我们需要获取当前机器的资源利用时,Java中如何获取呢?最方便的方式即使用com.sun.management.OperatingSystemMXBean来获取。

使用说明

虽然通过getProcessCpuLoadgetSystemCpuLoad可获取当前CPU的负载,但是当首次调用时,常常获取到的是不真实的值(甚至可能为负),且CPU负载常常是忽高忽低的,我们去获取的瞬间可能与真实值有较大的差距,为此可通过获取多次取均值的方式来获取近似值。

内存利用率可直接通过空闲内存与全部内存的比值方便获取到。

代码示例

资源利用率

为方便获取(设为每分钟获取一次),定义一个线程来循环获取(设每10s获取一次,然后取均值)。为避免首次取值是错误的,定义了一个initRate函数,来预获取值。

  1. class MonitorResourceThread extends Thread {
  2.     final int MAX_COUNT = 6;
  3.     private final double[] aryRates = new double[MAX_COUNT];
  4.     private int curIndex = 0;
  5.     @SuppressWarnings("restriction")
  6.     OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
  7.     private double getCPULoad() {
  8.         double proLoad = osBean.getProcessCpuLoad();
  9.         double sysLoad = osBean.getSystemCpuLoad();
  10.         System.out.printf("  --%s Load(%d cores)-- Process: %.5f, System: %.5f %n", osBean.getName(),
  11.                 osBean.getAvailableProcessors(), proLoad, sysLoad);
  12.         return (proLoad + sysLoad);
  13.     }
  14.     public void initRate() {
  15.         double rate = 0.0;
  16.         try {
  17.             while (true) {
  18.                 Thread.sleep(100);
  19.                 rate = getCPULoad();
  20.                 // System.out.println(rate);
  21.                 if (rate > 0.0 && rate < 1.0)
  22.                     break;
  23.             }
  24.         } catch (Exception ex) {
  25.             ex.printStackTrace();
  26.         }
  27.         Arrays.fill(aryRates, rate);
  28.     }
  29.     @Override
  30.     public void run() {
  31.         try {
  32.             while (true) {
  33.                 double rate = getCPULoad();
  34.                 if (rate < 0.0)
  35.                     continue;
  36.                 // add to array
  37.                 aryRates[curIndex++= rate;
  38.                 if (curIndex >= MAX_COUNT)
  39.                     curIndex %= MAX_COUNT;
  40.                 Thread.sleep(1000 * 10);
  41.             }
  42.         } catch (Exception ex) {
  43.             ex.printStackTrace();
  44.         }
  45.     }
  46.     public double getCPURate() {
  47.         double rate = Arrays.stream(aryRates).sum();
  48.         return rate / MAX_COUNT;
  49.     }
  50.     public double getMemoryRate() {
  51.         double rate = (double) osBean.getFreePhysicalMemorySize() / osBean.getTotalPhysicalMemorySize();
  52.         return 1 - rate;
  53.     }
  54. }

测试示例

  1. class Test{
  2.     public static void main(String[] args) {
  3.         MonitorResourceThread monThread = new MonitorResourceThread();
  4.         monThread.initRate();
  5.         try {
  6.             monThread.start();
  7.             int i = 0;
  8.             while (true) {
  9.                 String strOut = String.format("--%03d--: CPU: %.5f, Memory: %.5f"++i, monThread.getCPURate(),
  10.                         monThread.getMemoryRate());
  11.                 System.out.println(strOut);
  12.                 Thread.sleep(1000 * 60);
  13.             }
  14.         } catch (Exception e) {
  15.             e.printStackTrace();
  16.         }
  17.         System.out.println("Monitor end");
  18.     }
  19. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/58885
推荐阅读
相关标签
  

闽ICP备14008679号