xiangkun 发表于 2013-1-15 02:16:51

Java 关于操作系统

package com.bumt.police.test; import 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 - c0;                  long busytime = c1 - c0;                  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;            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 = idletime;                retn = 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;            }            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;      }     
页: [1]
查看完整版本: Java 关于操作系统