<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中,可以獲得總的物理內(nèi)存、剩余的物理內(nèi)存、已使用的物理內(nèi)存等信息,本例講解如何取得這些信息,并且獲得在Windows下的內(nèi)存使用率。
         首先編寫一個MonitorInfoBean類,用來裝載監(jiān)控的一些信息,包括物理內(nèi)存、剩余的物理內(nèi)存、已使用的物理內(nèi)存、內(nèi)存使用率等字段,該類的代碼如下:
    package com.amigo.performance;

    /**
     * 監(jiān)視信息的JavaBean類.
     * 
    @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
     * 
    @version 1.0 
     * Creation date: 2008-4-25 - 上午10:37:00
     
    */

    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;
        }

    }

         接著編寫一個獲得當(dāng)前的監(jiān)控信息的接口,該類的代碼如下所示:
    package com.amigo.performance;

    /**
     * 獲取系統(tǒng)信息的業(yè)務(wù)邏輯類接口.
     * 
    @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
     * 
    @version 1.0 
     * Creation date: 2008-3-11 - 上午10:06:06
     
    */

    public interface IMonitorService {
        
    /**
         * 獲得當(dāng)前的監(jiān)控對象.
         * 
    @return 返回構(gòu)造好的監(jiān)控對象
         * 
    @throws Exception
         * 
    @author <a href="mailto:xiexingxing1121@126.com">AmigoXie</a>
         * Creation date: 2008-4-25 - 上午10:45:08
         
    */

        
    public MonitorInfoBean getMonitorInfoBean() throws Exception;

    }
         該類的實現(xiàn)類MonitorServiceImpl如下所示:
    package com.amigo.performance;

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

    import sun.management.ManagementFactory;

    import com.sun.management.OperatingSystemMXBean;

    /**
     * 獲取系統(tǒng)信息的業(yè)務(wù)邏輯實現(xiàn)類.
     * 
    @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;

        
    /**
         * 獲得當(dāng)前的監(jiān)控對象.
         * 
    @return 返回構(gòu)造好的監(jiān)控對象
         * 
    @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;
            
            
    // 可使用內(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();
            }

            
            
    // 構(gòu)造返回對象
            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;
                    }

                    
    // 字段出現(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;
                    }

                    
    // 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(
    "可使用內(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");
        }

    }

            該實現(xiàn)類中需要用到一個自己編寫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對漢字處理存在問題(把一個漢字視為一個字節(jié)),因此在
         * 包含漢字的字符串時存在隱患,現(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;
        }

    }

            運行下MonitorBeanImpl類,讀者將會看到當(dāng)前的內(nèi)存、cpu利用率等信息。

            


    posted on 2008-04-30 17:15 阿蜜果 閱讀(4484) 評論(11)  編輯  收藏 所屬分類: Java


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

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

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

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



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

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

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

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關(guān)注blog

    積分與排名

    • 積分 - 2294312
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲av午夜成人片精品电影 | 特级av毛片免费观看| 久9热免费精品视频在线观看| 国产性生交xxxxx免费| 亚洲欧洲日产专区| 在线观看人成视频免费无遮挡| 日美韩电影免费看| 97久久精品亚洲中文字幕无码| 国产精品内射视频免费| 国产精品视_精品国产免费 | 亚洲AV色吊丝无码| 青柠影视在线观看免费| 亚洲电影日韩精品| 亚洲国产精品无码观看久久| 亚洲成人免费电影| 久久久影院亚洲精品| 国产成人无码免费网站| 国产在线观看免费不卡| 亚洲午夜福利在线视频| 日日麻批免费40分钟日本的| 亚洲成Av人片乱码色午夜| 国产福利在线观看永久免费| 免费一级特黄特色大片在线观看| 99热亚洲色精品国产88| 久久免费看黄a级毛片| 亚洲日本va午夜中文字幕一区| 国产又黄又爽胸又大免费视频| 亚洲国产精品成人久久蜜臀| 男人的天堂av亚洲一区2区| 成年人网站在线免费观看| 亚洲国产成人精品无码区在线秒播 | 久久亚洲春色中文字幕久久久| 搡女人免费免费视频观看| 国产亚洲精品线观看动态图| 日韩毛片在线免费观看| 又爽又高潮的BB视频免费看 | 羞羞视频免费网站日本| 国产成人免费a在线视频色戒| 亚洲精华液一二三产区| 日韩高清在线免费观看| 亚洲AV无码一区二区三区牲色|