(轉)Java獲得當前性能信息

          ??????在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-09-15 01:39 nonels 閱讀(232) 評論(0)  編輯  收藏 所屬分類: J2SE

          <2008年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類(16)

          隨筆檔案(16)

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 西乡县| 阿勒泰市| 宣化县| 连平县| 桑日县| 湟源县| 吉林省| 酒泉市| 桐庐县| 双牌县| 治多县| 吴桥县| 大连市| 南岸区| 潞西市| 视频| 翁牛特旗| 喀喇沁旗| 景东| 靖远县| 临夏县| 马尔康县| 张家界市| 莒南县| 凤城市| 武安市| 遂宁市| 鄂州市| 高尔夫| 安徽省| 隆安县| 湾仔区| 沂南县| 吉首市| 乐亭县| 达尔| 烟台市| 惠东县| 本溪| 湄潭县| 社旗县|