赞
踩
当我们需要获取当前机器的资源利用时,Java中如何获取呢?最方便的方式即使用com.sun.management.OperatingSystemMXBean
来获取。
虽然通过getProcessCpuLoad
和getSystemCpuLoad
可获取当前CPU的负载,但是当首次调用时,常常获取到的是不真实的值(甚至可能为负),且CPU负载常常是忽高忽低的,我们去获取的瞬间可能与真实值有较大的差距,为此可通过获取多次取均值的方式来获取近似值。
内存利用率可直接通过空闲内存与全部内存的比值方便获取到。
资源利用率
为方便获取(设为每分钟获取一次),定义一个线程来循环获取(设每10s获取一次,然后取均值)。为避免首次取值是错误的,定义了一个initRate函数,来预获取值。
- class MonitorResourceThread extends Thread {
- final int MAX_COUNT = 6;
- private final double[] aryRates = new double[MAX_COUNT];
- private int curIndex = 0;
-
- @SuppressWarnings("restriction")
- OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
-
- private double getCPULoad() {
- double proLoad = osBean.getProcessCpuLoad();
- double sysLoad = osBean.getSystemCpuLoad();
- System.out.printf(" --%s Load(%d cores)-- Process: %.5f, System: %.5f %n", osBean.getName(),
- osBean.getAvailableProcessors(), proLoad, sysLoad);
-
- return (proLoad + sysLoad);
- }
-
- public void initRate() {
- double rate = 0.0;
- try {
- while (true) {
- Thread.sleep(100);
- rate = getCPULoad();
- // System.out.println(rate);
- if (rate > 0.0 && rate < 1.0)
- break;
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- }
-
- Arrays.fill(aryRates, rate);
- }
-
- @Override
- public void run() {
- try {
- while (true) {
- double rate = getCPULoad();
- if (rate < 0.0)
- continue;
- // add to array
- aryRates[curIndex++] = rate;
- if (curIndex >= MAX_COUNT)
- curIndex %= MAX_COUNT;
-
- Thread.sleep(1000 * 10);
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
-
- public double getCPURate() {
- double rate = Arrays.stream(aryRates).sum();
-
- return rate / MAX_COUNT;
- }
-
- public double getMemoryRate() {
- double rate = (double) osBean.getFreePhysicalMemorySize() / osBean.getTotalPhysicalMemorySize();
- return 1 - rate;
- }
- }
测试示例
- class Test{
- public static void main(String[] args) {
- MonitorResourceThread monThread = new MonitorResourceThread();
- monThread.initRate();
-
- try {
- monThread.start();
-
- int i = 0;
- while (true) {
- String strOut = String.format("--%03d--: CPU: %.5f, Memory: %.5f", ++i, monThread.getCPURate(),
- monThread.getMemoryRate());
- System.out.println(strOut);
-
- Thread.sleep(1000 * 60);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println("Monitor end");
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。