JAVA获取系统信息

    技术2025-11-27  12

    从论坛里转载的,留着备查。 求的JVM本身的... ... [code="javaimport java.io.BufferedReader; import java.io.File; 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; 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 final File versionFile = new File("/proc/version");        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 = this.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;                    }                    // 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;        }        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");    }   } class Bytes {        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;        }    } 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;        }    }    interface IMonitorService {        public MonitorInfoBean getMonitorInfoBean() throws Exception;      }    code]    其中用到了探针
    最新回复(0)