欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

JSP获取服务器的CPU使用率、系统内存、虚拟机内存等情况(不用JNI),jspjni,在Java中,可以获得总

来源: javaer 分享于  点击 6537 次 点评:16

JSP获取服务器的CPU使用率、系统内存、虚拟机内存等情况(不用JNI),jspjni,在Java中,可以获得总


在Java中,可以获得总的物理内存、剩余的物理内存、已使用的物理内存等信息,下面例子可以取得这些信息,并且获得在Windows下的内存使用率。

首先编写一个MonitorInfoBean类,用来装载监控的一些信息,包括物理内存、剩余的物理内存、已使用的物理内存、内存使用率等字段,该类的代码如下:

package performance;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 performance;/** * 获取系统信息的业务逻辑类接口. */public interface IMonitorService {    /**     * 获得当前的监控对象.     *      * @return 返回构造好的监控对象     * @throws Exception     */    public MonitorInfoBean getMonitorInfoBean() throws Exception;}

该类的实现类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;/** *  * 获取系统信息的业务逻辑实现类. *  * @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;    /**     * 获得当前的监控对象.     *      * @return 返回构造好的监控对象     * @throws Exception     * @author GuoHuang     */    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();        } else {            cpuRatio = getCpuRateForLinux();        }        // 构造返回对象        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";            // 取进程信息            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;                }                // 字段出现顺序: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("可使用内存=" + 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 performance;/** * byte操作类. */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利用率等信息。在hardware.jsp中以文字加图像形式显示CPU使用率、系统内存(每隔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>运行状态</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("可使用内存=" + monitorInfo.getTotalMemory() + "<br>");            out.println("剩余内存=" + monitorInfo.getFreeMemory() + "<br>");            out.println("最大可使用内存=" + monitorInfo.getMaxMemory() + "<br>");            out.println("操作系统=" + monitorInfo.getOsName() + "<br>");            out.println("总的物理内存=" + monitorInfo.getTotalMemorySize() + "kb"                    + "<br>");            out.println("剩余的物理内存=" + monitorInfo.getFreeMemory() + "kb"                    + "<br>");            out.println("已使用的物理内存=" + monitorInfo.getUsedMemory() + "kb"                    + "<br>");            out.println("线程总数=" + 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">                            </td>                        </tr>                    </table>                </td>            </tr>        </table>        <table width="1000" style="height: 0.5px;">            <tr>                <td></td>            </tr>        </table>        内存:<%            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">                            </td>                        </tr>                    </table>                </td>            </tr>        </table>    </body></html>
相关栏目:

用户点评