隨筆 - 147  文章 - 71  trackbacks - 0
          <2012年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(1)

          隨筆分類(146)

          隨筆檔案(147)

          文章分類(28)

          文章檔案(28)

          喜歡的Blog

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          在Java中,可以獲得總的物理內(nèi)存、剩余的物理內(nèi)存、已使用的物理內(nèi)存等信息,下面例子可以取得這些信息,并且獲得在Windows下的內(nèi)存使用率。
          首先編寫一個(gè)MonitorInfoBean類,用來裝載監(jiān)控的一些信息,包括物理內(nèi)存、剩余的物理內(nèi)存、已使用的物理內(nèi)存、內(nèi)存使用率等字段,該類的代碼如下:
          package performance;

          public class MonitorInfoBean {
              
          /** 可使用內(nèi)存. */
              
          private long totalMemory;
              
          /** 剩余內(nèi)存. */
              
          private long freeMemory;
              
          /** 最大可使用內(nèi)存. */
              
          private long maxMemory;
              
          /** 操作系統(tǒng). */
              
          private String osName;
              
          /** 總的物理內(nèi)存. */
              
          private long totalMemorySize;
              
          /** 剩余的物理內(nèi)存. */
              
          private long freePhysicalMemorySize;
              
          /** 已使用的物理內(nèi)存. */
              
          private long usedMemory;
              
          /** 線程總數(shù). */
              
          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;
              }
          }
          接著編寫一個(gè)獲得當(dāng)前的監(jiān)控信息的接口,該類的代碼如下所示:
          package performance;

          /**
           * 獲取系統(tǒng)信息的業(yè)務(wù)邏輯類接口.
           
          */
          public interface IMonitorService {
              
          /**
               * 獲得當(dāng)前的監(jiān)控對(duì)象.
               * 
               * 
          @return 返回構(gòu)造好的監(jiān)控對(duì)象
               * 
          @throws Exception
               
          */
              
          public MonitorInfoBean getMonitorInfoBean() throws Exception;
          }
          該類的實(shí)現(xiàn)類MonitorServiceImpl如下所示:
          package performance;

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStream;
          import java.io.InputStreamReader;
          import java.io.LineNumberReader;
          import java.util.StringTokenizer;
          import sun.management.ManagementFactory;
          import com.sun.management.OperatingSystemMXBean;

          /**
           * 
           * 獲取系統(tǒng)信息的業(yè)務(wù)邏輯實(shí)現(xiàn)類.
           * 
           * 
          @author GuoHuang
           
          */
          public class MonitorServiceImpl implements IMonitorService {
              
          private static final int CPUTIME = 30;
              
          private static final int PERCENT = 100;
              
          private static final int FAULTLENGTH = 10;
              
          private static String linuxVersion = null;

              
          /**
               * 獲得當(dāng)前的監(jiān)控對(duì)象.
               * 
               * 
          @return 返回構(gòu)造好的監(jiān)控對(duì)象
               * 
          @throws Exception
               * 
          @author GuoHuang
               
          */
              
          public MonitorInfoBean getMonitorInfoBean() throws Exception {
                  
          int kb = 1024;
                  
          // 可使用內(nèi)存
                  long totalMemory = Runtime.getRuntime().totalMemory() / kb;
                  
          // 剩余內(nèi)存
                  long freeMemory = Runtime.getRuntime().freeMemory() / kb;
                  
          // 最大可使用內(nèi)存
                  long maxMemory = Runtime.getRuntime().maxMemory() / kb;
                  OperatingSystemMXBean osmxb 
          = (OperatingSystemMXBean) ManagementFactory
                          .getOperatingSystemMXBean();
                  
          // 操作系統(tǒng)
                  String osName = System.getProperty("os.name");
                  
          // 總的物理內(nèi)存
                  long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb;
                  
          // 剩余的物理內(nèi)存
                  long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb;
                  
          // 已使用的物理內(nèi)存
                  long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb
                          .getFreePhysicalMemorySize())
                          
          / kb;
                  
          // 獲得線程總數(shù)
                  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();
                  } 
          else {
                      cpuRatio 
          = getCpuRateForLinux();
                  }
                  
          // 構(gòu)造返回對(duì)象
                  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;
              }

              
          private static double getCpuRateForLinux() {
                  InputStream is 
          = null;
                  InputStreamReader isr 
          = null;
                  BufferedReader brStat 
          = null;
                  StringTokenizer tokenStat 
          = null;
                  
          try {
                      System.out.println(
          "Get usage rate of CUP , linux version: "
                              
          + linuxVersion);
                      Process process 
          = Runtime.getRuntime().exec("top -b -n 1");
                      is 
          = process.getInputStream();
                      isr 
          = new InputStreamReader(is);
                      brStat 
          = new BufferedReader(isr);
                      
          if (linuxVersion.equals("2.4")) {
                          brStat.readLine();
                          brStat.readLine();
                          brStat.readLine();
                          brStat.readLine();
                          tokenStat 
          = new StringTokenizer(brStat.readLine());
                          tokenStat.nextToken();
                          tokenStat.nextToken();
                          String user 
          = tokenStat.nextToken();
                          tokenStat.nextToken();
                          String system 
          = tokenStat.nextToken();
                          tokenStat.nextToken();
                          String nice 
          = tokenStat.nextToken();
                          System.out.println(user 
          + " , " + system + " , " + nice);
                          user 
          = user.substring(0, user.indexOf("%"));
                          system 
          = system.substring(0, system.indexOf("%"));
                          nice 
          = nice.substring(0, nice.indexOf("%"));
                          
          float userUsage = new Float(user).floatValue();
                          
          float systemUsage = new Float(system).floatValue();
                          
          float niceUsage = new Float(nice).floatValue();
                          
          return (userUsage + systemUsage + niceUsage) / 100;
                      } 
          else {
                          brStat.readLine();
                          brStat.readLine();
                          tokenStat 
          = new StringTokenizer(brStat.readLine());
                          tokenStat.nextToken();
                          tokenStat.nextToken();
                          tokenStat.nextToken();
                          tokenStat.nextToken();
                          tokenStat.nextToken();
                          tokenStat.nextToken();
                          tokenStat.nextToken();
                          String cpuUsage 
          = tokenStat.nextToken();
                          System.out.println(
          "CPU idle : " + cpuUsage);
                          Float usage 
          = new Float(cpuUsage.substring(0, cpuUsage
                                  .indexOf(
          "%")));
                          
          return (1 - usage.floatValue() / 100);
                      }
                  } 
          catch (IOException ioe) {
                      System.out.println(ioe.getMessage());
                      freeResource(is, isr, brStat);
                      
          return 1;
                  } 
          finally {
                      freeResource(is, isr, brStat);
                  }
              }

              
          private static void freeResource(InputStream is, InputStreamReader isr,
                      BufferedReader br) {
                  
          try {
                      
          if (is != null)
                          is.close();
                      
          if (isr != null)
                          isr.close();
                      
          if (br != null)
                          br.close();
                  } 
          catch (IOException ioe) {
                      System.out.println(ioe.getMessage());
                  }
              }

              
          /**
               * 獲得CPU使用率.
               * 
               * 
          @return 返回cpu使用率
               * 
          @author GuoHuang
               
          */
              
          private double getCpuRatioForWindows() {
                  
          try {
                      String procCmd 
          = System.getenv("windir")
                              
          + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine,KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";
                      
          // 取進(jìn)程信息
                      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 GuoHuang
               
          */
              
          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;
                          }
                          
          // 字段出現(xiàn)順序: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;
                          }
                          String s1 
          = Bytes.substring(line, kmtidx, rocidx - 1).trim();
                          String s2 
          = Bytes.substring(line, umtidx, wocidx - 1).trim();
                          
          if (caption.equals("System Idle Process")
                                  
          || caption.equals("System")) {
                              
          if (s1.length() > 0)
                                  idletime 
          += Long.valueOf(s1).longValue();
                              
          if (s2.length() > 0)
                                  idletime 
          += Long.valueOf(s2).longValue();
                              
          continue;
                          }
                          
          if (s1.length() > 0)
                              kneltime 
          += Long.valueOf(s1).longValue();
                          
          if (s2.length() > 0)
                              usertime 
          += Long.valueOf(s2).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 GuoHuang
               
          */
              
          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(
          "可使用內(nèi)存=" + monitorInfo.getTotalMemory());
                  System.out.println(
          "剩余內(nèi)存=" + monitorInfo.getFreeMemory());
                  System.out.println(
          "最大可使用內(nèi)存=" + monitorInfo.getMaxMemory());
                  System.out.println(
          "操作系統(tǒng)=" + monitorInfo.getOsName());
                  System.out.println(
          "總的物理內(nèi)存=" + monitorInfo.getTotalMemorySize() + "kb");
                  System.out.println(
          "剩余的物理內(nèi)存=" + monitorInfo.getFreeMemory() + "kb");
                  System.out.println(
          "已使用的物理內(nèi)存=" + monitorInfo.getUsedMemory() + "kb");
                  System.out.println(
          "線程總數(shù)=" + monitorInfo.getTotalThread() + "kb");
              }
          }
          該實(shí)現(xiàn)類中需要用到一個(gè)自己編寫byte的工具類,該類的代碼如下所示:
          package performance;

          /**
           * byte操作類.
           
          */
          public class Bytes {
              
          /**
               * 由于String.subString對(duì)漢字處理存在問題(把一個(gè)漢字視為一個(gè)字節(jié)),因此在 包含漢字的字符串時(shí)存在隱患,現(xiàn)調(diào)整如下:
               * 
               * 
          @param src
               *            要截取的字符串
               * 
          @param start_idx
               *            開始坐標(biāo)(包括該坐標(biāo))
               * 
          @param end_idx
               *            截止坐標(biāo)(包括該坐標(biāo))
               * 
          @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;
              }
          }
          運(yùn)行下MonitorBeanImpl類,讀者將會(huì)看到當(dāng)前的內(nèi)存、cpu利用率等信息。
          在hardware.jsp中以文字加圖像形式顯示CPU使用率、系統(tǒng)內(nèi)存(每隔5秒刷新一次),代碼如下所示:
          <%@ page language="java" import="performance.*" pageEncoding="utf-8"%>

          <%
              
          String path = request.getContextPath();
              
          String basePath = request.getScheme() + "://"
                      
          + request.getServerName() + ":" + request.getServerPort()
                      
          + path + "/";
          %>

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
              
          <head>
                  
          <base href="<%=basePath%>">

                  
          <title>運(yùn)行狀態(tài)</title>

                  
          <meta http-equiv="pragma" content="no-cache">
                  
          <meta http-equiv="cache-control" content="no-cache">
                  
          <meta http-equiv="expires" content="0">
                  
          <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
                  
          <meta http-equiv="description" content="This is my page">
                  
          <meta http-equiv="refresh" content="5">

              
          </head>

              
          <body>
                  
          <%
                      IMonitorService service 
          = new MonitorServiceImpl();
                      MonitorInfoBean monitorInfo 
          = service.getMonitorInfoBean();
                      out.println(
          "cpu占有率=" + monitorInfo.getCpuRatio() + "<br>");
                      out.println(
          "可使用內(nèi)存=" + monitorInfo.getTotalMemory() + "<br>");
                      out.println(
          "剩余內(nèi)存=" + monitorInfo.getFreeMemory() + "<br>");
                      out.println(
          "最大可使用內(nèi)存=" + monitorInfo.getMaxMemory() + "<br>");
                      out.println(
          "操作系統(tǒng)=" + monitorInfo.getOsName() + "<br>");
                      out.println(
          "總的物理內(nèi)存=" + monitorInfo.getTotalMemorySize() + "kb"
                              
          + "<br>");
                      out.println(
          "剩余的物理內(nèi)存=" + monitorInfo.getFreeMemory() + "kb"
                              
          + "<br>");
                      out.println(
          "已使用的物理內(nèi)存=" + monitorInfo.getUsedMemory() + "kb"
                              
          + "<br>");
                      out.println(
          "線程總數(shù)=" + monitorInfo.getTotalThread() + "kb" + "<br>");
                  
          %>

                  cpu:
                  
          <table width="150" style="border: 1px solid #00FF00;">
                      
          <tr>
                          
          <td>
                              
          <table width="150" bgcolor="#FFFFFF" cellpadding="0"
                                  cellspacing
          ="0">
                                  
          <tr>
                                      
          <td width="<%=monitorInfo.getCpuRatio()%>%" bgcolor="#00FF00"
                                          align
          ="center">
                                          
          <%=(int) (monitorInfo.getCpuRatio())%>%
                                      
          </td>
                                      
          <td bgcolor="#FFFFFF">
                                          
          &nbsp;
                                      
          </td>
                                  
          </tr>
                              
          </table>
                          
          </td>
                      
          </tr>
                  
          </table>

                  
          <table width="1000" style="height: 0.5px;">
                      
          <tr>
                          
          <td></td>
                      
          </tr>
                  
          </table>
                  內(nèi)存:
          <%
                      
          int memory = (int) (monitorInfo.getUsedMemory() * 100 / monitorInfo
                              .getTotalMemorySize());
                  
          %>
                  
          <table width="150" style="border: 1px solid #00FF00;">
                      
          <tr>
                          
          <td>
                              
          <table width="150" bgcolor="#FFFFFF" cellpadding="0"
                                  cellspacing
          ="0">
                                  
          <tr>
                                      
          <td width="<%=memory%>%" bgcolor="#00FF00" align="center">
                                          
          <%=memory%>%
                                      
          </td>
                                      
          <td bgcolor="#FFFFFF">
                                          
          &nbsp;
                                      
          </td>
                                  
          </tr>
                              
          </table>
                          
          </td>
                      
          </tr>
                  
          </table>
              
          </body>
          </html>
          最終效果如圖所示:
          posted on 2012-08-24 16:48 飛翔天使 閱讀(4866) 評(píng)論(2)  編輯  收藏 所屬分類: JSP

          FeedBack:
          # re: JSP獲取CPU使用率、系統(tǒng)內(nèi)存、虛擬機(jī)內(nèi)存等情況(不用JNI) 2012-08-24 23:00 Swift Java Tools
          原來是JMX,這代碼夠復(fù)雜的,就取這么點(diǎn)數(shù)據(jù)。  回復(fù)  更多評(píng)論
            
          # re: JSP獲取CPU使用率、系統(tǒng)內(nèi)存、虛擬機(jī)內(nèi)存等情況(不用JNI) 2012-08-29 22:21 stevenfrog
          還行,支持一下  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 淳化县| 吉木萨尔县| 盐源县| 靖宇县| 五家渠市| 定安县| 丽江市| 房产| 新沂市| 平邑县| 孝感市| 长岛县| 禹城市| 东丰县| 汉寿县| 喀喇沁旗| 沾化县| 荆州市| 兴化市| 克山县| 札达县| 武宣县| 吉水县| 深水埗区| 峨眉山市| 资溪县| 眉山市| 赣榆县| 象州县| 罗城| 平远县| 手机| 涟水县| 南召县| 大兴区| 丹阳市| 高淳县| 兰溪市| 虹口区| 岢岚县| 赣榆县|