<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 阿蜜果 閱讀(4484) 評論(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

    積分與排名

    • 積分 - 2294803
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品美女在线观看播放| 亚洲福利中文字幕在线网址| 亚洲AV人无码激艳猛片| fc2成年免费共享视频网站| 国产嫩草影院精品免费网址| 亚洲丰满熟女一区二区哦| 国内自产少妇自拍区免费| jiz zz在亚洲| 精品国产一区二区三区免费看| 亚洲精品无码专区在线播放| 国内大片在线免费看| 色婷婷亚洲一区二区三区| 国产一卡二卡≡卡四卡免费乱码| 亚洲va中文字幕| 亚洲情侣偷拍精品| 三上悠亚在线观看免费| 久久亚洲精品成人综合| 亚洲网站免费观看| 亚洲精品无播放器在线播放 | 亚洲电影在线免费观看| 亚洲伦理一二三四| 日韩a级毛片免费视频| 一个人看的免费视频www在线高清动漫 | 美女视频黄的全免费视频| 亚洲中文字幕无码中文字| 四虎永久成人免费影院域名| 春意影院午夜爽爽爽免费| 久久99国产亚洲高清观看首页| 91香蕉在线观看免费高清| 亚洲人成黄网在线观看| 国产一精品一aⅴ一免费| 免费看黄的成人APP| 亚洲国产日韩在线一区| 免费无遮挡无码永久在线观看视频| 一区二区三区在线免费| 精品无码一区二区三区亚洲桃色| 青青青青青青久久久免费观看| 国产A∨免费精品视频| 亚洲一区精品视频在线| 男人的天堂亚洲一区二区三区 | 久久亚洲色WWW成人欧美|