隨筆-59  評論-31  文章-0  trackbacks-0
              在Java中,可以獲得總的物理內存、剩余的物理內存、已使用的物理內存等信息,本例講解如何取得這些信息,并且獲得在Windows下的內存使用率。
               首先編寫一個MonitorInfoBean類,用來裝載監控的一些信息,包括物理內存、剩余的物理內存、已使用的物理內存、內存使用率等字段,該類的代碼如下:
                

          package com.amigo.performance;

          /**
           * 監視信息的JavaBean類.
           * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
           * 
          @version 1.0 
           * Creation date: 2008-4-25 - 上午10:37:00
           
          */
          public class MonitorInfoBean {
              /** 可使用內存. */
              private long totalMemory;
              
              /** 剩余內存. */
              private long freeMemory;
              
              /** 最大可使用內存. */
              private long maxMemory;
              
              /** 操作系統. */
              private String osName;
              
              /** 總的物理內存. */
              private long totalMemorySize;
              
              /** 剩余的物理內存. */
              private long freePhysicalMemorySize;
              
              /** 已使用的物理內存. */
              private long usedMemory;
              
              /** 線程總數. */
              private int totalThread;
              
              /** cpu使用率. */
              private double cpuRatio;

              public long getFreeMemory() {
                  return freeMemory;
              }

              public void setFreeMemory(long freeMemory) {
                  this.freeMemory = freeMemory;
              }

              public long getFreePhysicalMemorySize() {
                  return freePhysicalMemorySize;
              }

              public void setFreePhysicalMemorySize(long freePhysicalMemorySize) {
                  this.freePhysicalMemorySize = freePhysicalMemorySize;
              }

              public long getMaxMemory() {
                  return maxMemory;
              }

              public void setMaxMemory(long maxMemory) {
                  this.maxMemory = maxMemory;
              }

              public String getOsName() {
                  return osName;
              }

              public void setOsName(String osName) {
                  this.osName = osName;
              }

              public long getTotalMemory() {
                  return totalMemory;
              }

              public void setTotalMemory(long totalMemory) {
                  this.totalMemory = totalMemory;
              }

              public long getTotalMemorySize() {
                  return totalMemorySize;
              }

              public void setTotalMemorySize(long totalMemorySize) {
                  this.totalMemorySize = totalMemorySize;
              }

              public int getTotalThread() {
                  return totalThread;
              }

              public void setTotalThread(int totalThread) {
                  this.totalThread = totalThread;
              }

              public long getUsedMemory() {
                  return usedMemory;
              }

              public void setUsedMemory(long usedMemory) {
                  this.usedMemory = usedMemory;
              }

              public double getCpuRatio() {
                  return cpuRatio;
              }

              public void setCpuRatio(double cpuRatio) {
                  this.cpuRatio = cpuRatio;
              }
          }

          接著編寫一個獲得當前的監控信息的接口,該類的代碼如下所示:

          package com.amigo.performance;

          /**
           * 獲取系統信息的業務邏輯類接口.
           * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
           * 
          @version 1.0 
           * Creation date: 2008-3-11 - 上午10:06:06
           
          */
          public interface IMonitorService {
              /**
               * 獲得當前的監控對象.
               * 
          @return 返回構造好的監控對象
               * 
          @throws Exception
               * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
               * Creation date: 2008-4-25 - 上午10:45:08
               
          */
              public MonitorInfoBean getMonitorInfoBean() throws Exception;

          }

          該類的實現類MonitorServiceImpl如下所示:


          package com.amigo.performance;

          import java.io.InputStreamReader;
          import java.io.LineNumberReader;

          import sun.management.ManagementFactory;

          import com.sun.management.OperatingSystemMXBean;

          /**
           * 獲取系統信息的業務邏輯實現類.
           * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
           * 
          @version 1.0 Creation date: 2008-3-11 - 上午10:06:06
           
          */
          public class MonitorServiceImpl implements IMonitorService {
              
              private static final int CPUTIME = 30;

              private static final int PERCENT = 100;

              private static final int FAULTLENGTH = 10;

              /**
               * 獲得當前的監控對象.
               * 
          @return 返回構造好的監控對象
               * 
          @throws Exception
               * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
               * Creation date: 2008-4-25 - 上午10:45:08
               
          */
              public MonitorInfoBean getMonitorInfoBean() throws Exception {
                  int kb = 1024;
                  
                  // 可使用內存
                  long totalMemory = Runtime.getRuntime().totalMemory() / kb;
                  // 剩余內存
                  long freeMemory = Runtime.getRuntime().freeMemory() / kb;
                  // 最大可使用內存
                  long maxMemory = Runtime.getRuntime().maxMemory() / kb;

                  OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory
                          .getOperatingSystemMXBean();

                  // 操作系統
                  String osName = System.getProperty("os.name");
                  // 總的物理內存
                  long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb;
                  // 剩余的物理內存
                  long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb;
                  // 已使用的物理內存
                  long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb
                          .getFreePhysicalMemorySize())
                          / kb;

                  // 獲得線程總數
                  ThreadGroup parentThread;
                  for (parentThread = Thread.currentThread().getThreadGroup(); parentThread
                          .getParent() != null; parentThread = parentThread.getParent())
                      ;
                  int totalThread = parentThread.activeCount();

                  double cpuRatio = 0;
                  if (osName.toLowerCase().startsWith("windows")) {
                      cpuRatio = this.getCpuRatioForWindows();
                  }
                  
                  // 構造返回對象
                  MonitorInfoBean infoBean = new MonitorInfoBean();
                  infoBean.setFreeMemory(freeMemory);
                  infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);
                  infoBean.setMaxMemory(maxMemory);
                  infoBean.setOsName(osName);
                  infoBean.setTotalMemory(totalMemory);
                  infoBean.setTotalMemorySize(totalMemorySize);
                  infoBean.setTotalThread(totalThread);
                  infoBean.setUsedMemory(usedMemory);
                  infoBean.setCpuRatio(cpuRatio);
                  return infoBean;
              }

              /**
               * 獲得CPU使用率.
               * 
          @return 返回cpu使用率
               * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
               * Creation date: 2008-4-25 - 下午06:05:11
               
          */
              private double getCpuRatioForWindows() {
                  try {
                      String procCmd = System.getenv("windir")
                              + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine,"
                              + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";
                      // 取進程信息
                      long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd));
                      Thread.sleep(CPUTIME);
                      long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd));
                      if (c0 != null && c1 != null) {
                          long idletime = c1[0] - c0[0];
                          long busytime = c1[1] - c0[1];
                          return Double.valueOf(
                                  PERCENT * (busytime) / (busytime + idletime))
                                  .doubleValue();
                      } else {
                          return 0.0;
                      }
                  } catch (Exception ex) {
                      ex.printStackTrace();
                      return 0.0;
                  }
              }

              /**
               * 讀取CPU信息.
               * 
          @param proc
               * 
          @return
               * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
               * Creation date: 2008-4-25 - 下午06:10:14
               
          */
              private long[] readCpu(final Process proc) {
                  long[] retn = new long[2];
                  try {
                      proc.getOutputStream().close();
                      InputStreamReader ir = new InputStreamReader(proc.getInputStream());
                      LineNumberReader input = new LineNumberReader(ir);
                      String line = input.readLine();
                      if (line == null || line.length() < FAULTLENGTH) {
                          return null;
                      }
                      int capidx = line.indexOf("Caption");
                      int cmdidx = line.indexOf("CommandLine");
                      int rocidx = line.indexOf("ReadOperationCount");
                      int umtidx = line.indexOf("UserModeTime");
                      int kmtidx = line.indexOf("KernelModeTime");
                      int wocidx = line.indexOf("WriteOperationCount");
                      long idletime = 0;
                      long kneltime = 0;
                      long usertime = 0;
                      while ((line = input.readLine()) != null) {
                          if (line.length() < wocidx) {
                              continue;
                          }
                          // 字段出現順序:Caption,CommandLine,KernelModeTime,ReadOperationCount,
                          
          // ThreadCount,UserModeTime,WriteOperation
                          String caption = Bytes.substring(line, capidx, cmdidx - 1)
                                  .trim();
                          String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim();
                          if (cmd.indexOf("wmic.exe") >= 0) {
                              continue;
                          }
                          // log.info("line="+line);
                          if (caption.equals("System Idle Process")
                                  || caption.equals("System")) {
                              idletime += Long.valueOf(
                                      Bytes.substring(line, kmtidx, rocidx - 1).trim())
                                      .longValue();
                              idletime += Long.valueOf(
                                      Bytes.substring(line, umtidx, wocidx - 1).trim())
                                      .longValue();
                              continue;
                          }

                          kneltime += Long.valueOf(
                                  Bytes.substring(line, kmtidx, rocidx - 1).trim())
                                  .longValue();
                          usertime += Long.valueOf(
                                  Bytes.substring(line, umtidx, wocidx - 1).trim())
                                  .longValue();
                      }
                      retn[0] = idletime;
                      retn[1] = kneltime + usertime;
                      return retn;
                  } catch (Exception ex) {
                      ex.printStackTrace();
                  } finally {
                      try {
                          proc.getInputStream().close();
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
                  return null;
              }
              
              /**
               * 測試方法.
               * 
          @param args
               * 
          @throws Exception
               * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
               * Creation date: 2008-4-30 - 下午04:47:29
               
          */
              public static void main(String[] args) throws Exception {
                  IMonitorService service = new MonitorServiceImpl();
                  MonitorInfoBean monitorInfo = service.getMonitorInfoBean();
                  System.out.println("cpu占有率=" + monitorInfo.getCpuRatio());
                  
                  System.out.println("可使用內存=" + monitorInfo.getTotalMemory());
                  System.out.println("剩余內存=" + monitorInfo.getFreeMemory());
                  System.out.println("最大可使用內存=" + monitorInfo.getMaxMemory());
                  
                  System.out.println("操作系統=" + monitorInfo.getOsName());
                  System.out.println("總的物理內存=" + monitorInfo.getTotalMemorySize() + "kb");
                  System.out.println("剩余的物理內存=" + monitorInfo.getFreeMemory() + "kb");
                  System.out.println("已使用的物理內存=" + monitorInfo.getUsedMemory() + "kb");
                  System.out.println("線程總數=" + monitorInfo.getTotalThread() + "kb");
              }
          }

          該實現類中需要用到一個自己編寫byte的工具類,該類的代碼如下所示:


          package com.amigo.performance;

          /**
           * byte操作類.
           * 
          @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
           * 
          @version 1.0 
           * Creation date: 2008-4-30 - 下午04:57:23
           
          */
          public class Bytes {
              /**
               * 由于String.subString對漢字處理存在問題(把一個漢字視為一個字節),因此在
               * 包含漢字的字符串時存在隱患,現調整如下:
               * 
          @param src 要截取的字符串
               * 
          @param start_idx 開始坐標(包括該坐標)
               * 
          @param end_idx   截止坐標(包括該坐標)
               * 
          @return
               
          */
              public static String substring(String src, int start_idx, int end_idx){
                  byte[] b = src.getBytes();
                  String tgt = "";
                  for(int i=start_idx; i<=end_idx; i++){
                      tgt +=(char)b[i];
                  }
                  return tgt;
              }
          }

          運行下MonitorBeanImpl類,讀者將會看到當前的內存、cpu利用率等信息。











          posted on 2012-01-04 14:54 RoyPayne 閱讀(1992) 評論(1)  編輯  收藏 所屬分類: java高級

          評論:
          # re: 用Java獲得當前性能信息 2013-07-17 18:08 | 漁魚
          getTotalPhysicalMemorySize()方法在windows 7上面只能獲取到一根內存條的容量,其它系統未測試過。  回復  更多評論
            
          主站蜘蛛池模板: 乐业县| 精河县| 北碚区| 铜梁县| 抚顺市| 孟津县| 临颍县| 广水市| 武城县| 江都市| 神池县| 白河县| 石阡县| 上高县| 确山县| 准格尔旗| 清新县| 淮南市| 青浦区| 奇台县| 肥城市| 腾冲县| 涟水县| 太康县| 那曲县| 武清区| 高淳县| 长沙市| 贵港市| 永登县| 合作市| 张北县| 泽州县| 和龙市| 高青县| 佛冈县| 青浦区| 拉孜县| 郁南县| 休宁县| 轮台县|