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

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

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

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

    常用鏈接

    留言簿(1)

    隨筆分類(146)

    隨筆檔案(147)

    文章分類(28)

    文章檔案(28)

    喜歡的Blog

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    在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)控對象.
         * 
         * 
    @return 返回構(gòu)造好的監(jiān)控對象
         * 
    @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)控對象.
         * 
         * 
    @return 返回構(gòu)造好的監(jiān)控對象
         * 
    @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)造返回對象
            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對漢字處理存在問題(把一個(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類,讀者將會看到當(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 飛翔天使 閱讀(4856) 評論(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ù)  更多評論
      
    # re: JSP獲取CPU使用率、系統(tǒng)內(nèi)存、虛擬機(jī)內(nèi)存等情況(不用JNI) 2012-08-29 22:21 stevenfrog
    還行,支持一下  回復(fù)  更多評論
      
    主站蜘蛛池模板: 国产亚洲视频在线播放大全| 亚洲国产精品久久丫| 亚洲同性男gay网站在线观看| 亚洲乱码中文字幕在线| 9久久免费国产精品特黄| 国产成人精品免费午夜app| 亚洲AV无码之日韩精品| 亚洲国产成a人v在线| 午夜在线免费视频 | 亚洲最大的视频网站| 免费国产高清毛不卡片基地| 88xx成人永久免费观看| 亚洲第一区在线观看| 亚洲成人在线免费观看| 国产精品免费看久久久香蕉| 嫖丰满老熟妇AAAA片免费看| 国产综合精品久久亚洲| 亚洲人成7777| 久久精品免费视频观看| 免费jlzzjlzz在线播放视频| 亚洲午夜电影一区二区三区| 中文字幕在线观看免费| 免费无码一区二区三区蜜桃大| 亚洲产国偷V产偷V自拍色戒| 美景之屋4在线未删减免费| 成人浮力影院免费看| 亚洲熟妇无码另类久久久| 亚洲爆乳成av人在线视菜奈实| 99精品免费观看| 国产成人综合亚洲亚洲国产第一页| 亚洲七久久之综合七久久| 1000部无遮挡拍拍拍免费视频观看| 国产a v无码专区亚洲av| 亚洲爆乳精品无码一区二区| 免费AA片少妇人AA片直播 | 亚洲人成影院在线无码按摩店| MM1313亚洲精品无码久久| 中文字幕影片免费在线观看| 亚洲日本在线看片| 中文字幕在线免费看线人| 亚洲人成网站色在线入口|