posts - 297,  comments - 1618,  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 2008-04-30 17:15 阿蜜果 閱讀(4489) 評論(11)  編輯  收藏 所屬分類: Java


          FeedBack:
          # re: 用Java獲得當前性能信息
          2008-04-30 17:31 | 隔葉黃鶯
          Runtime 獲取一些信息, WMI 獲取一些信息,代碼怎么就這么這多呢?

          還是用 win32 的 api 簡單。  回復  更多評論
            
          # re: 用Java獲得當前性能信息
          2008-04-30 18:14 | BeanSoft
          還可以用 JMX,JDK 5,6新增了好多讀取系統信息的辦法。例如jconsole就是這樣實現的。  回復  更多評論
            
          # re: 用Java獲得當前性能信息
          2008-04-30 18:45 | J@mes
          這篇文章太棒了!以前總是因為知道java要獲得系統信息比C++麻煩,懶得探索實踐,現在前輩寫出來了,好好學習一下。  回復  更多評論
            
          # re: 用Java獲得當前性能信息
          2008-04-30 20:13 | 隔葉黃鶯
          看這么多,我還是寧愿有動態庫代碼來讀取這些信息。  回復  更多評論
            
          # re: 用Java獲得當前性能信息
          2008-05-02 15:25 | GouGou
          可以跨平臺不???  回復  更多評論
            
          # re: 用Java獲得當前性能信息
          2008-05-04 09:04 | 扭轉乾坤
          好文章,仔細研讀!  回復  更多評論
            
          # re: 用Java獲得當前性能信息
          2008-05-04 09:37 | liigo
          屬于設計過度吧, ...
          讀者急切想看到的是以下代碼,我摘錄出來:

          // 可使用內存
          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();
          }  回復  更多評論
            
          # re: 用Java獲得當前性能信息
          2008-05-04 11:19 | 小高
          很搞笑的代碼 一本入門的java書里面就 讀取系統信息.....
          看到很多人閱讀 ...進來看看.. 不知道這里人都不懂還是什么...

          為了刷排名把 ?? 這樣的文章也放首頁 ...



          積分與排名積分 - 178225
          排名 - 32
            回復  更多評論
            
          # re: 用Java獲得當前性能信息
          2008-07-04 11:53 | kakaluyi
          文章很好,多謝阿蜜果
          樓上的認真看了沒有,涉及了位操作,估計你寫不出來  回復  更多評論
            
          # re: 用Java獲得當前性能信息[未登錄]
          2008-08-05 09:11 | dragon
          寫的很好。最好是能把每一部涉及到的知識都給簡單的說一下。就是實現沒一步都要具備哪些知識。還有的說調用win32下的api
          說了就把例子給寫出來
          能看到這個帖子的人。是因為還是個初學者。  回復  更多評論
            
          # re: 用Java獲得當前性能信息[未登錄]
          2014-11-12 11:14 | 陳碧滔
          這代碼,放到jboss中就沒用了,jdk沒有權限訪問,需要在jboss里增加配置,如果不增加配置,用相同包名來放代碼,會有類型轉換異常。  回復  更多評論
            
          <2008年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

                生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
                我的作品:
                玩轉Axure RP  (2015年12月出版)
                

                Power Designer系統分析與建模實戰  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關注blog

          積分與排名

          • 積分 - 2296322
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 洪洞县| 响水县| 合江县| 安泽县| 竹山县| 桓台县| 吴桥县| 金山区| 平山县| 赣州市| 临武县| 河池市| 湟源县| 新河县| 彰化县| 榆林市| 于田县| 威信县| 宜章县| 亳州市| 徐水县| 射洪县| 腾冲县| 四会市| 泰宁县| 天祝| 上高县| 长治县| 凤山县| 朝阳区| 临沭县| 万源市| 常熟市| 沅陵县| 山阳县| 鲜城| 霸州市| 长宁区| 周宁县| 驻马店市| 潮州市|