java获得CPU使用率,系统内存,虚拟机内存等情况

来源:互联网 发布:mac电池循环次数 cmd r 编辑:程序博客网 时间:2024/05/19 18:12

通过jmx可以监控vm内存使用,系统内存使用等 
以下是网上某博客代码,特点是通过window和linux命令获得CPU使用率。 

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;       }   }         之后,建立bean的接口     public interface IMonitorService {       public MonitorInfoBean getMonitorInfoBean() throws Exception;     }       然后,就是最关键的,得到cpu的利用率,已用内存,可用内存,最大内存等信息。     import java.io.InputStreamReader;   import java.io.LineNumberReader;     import sun.management.ManagementFactory;     import com.sun.management.OperatingSystemMXBean;   import java.io.*;   import java.util.StringTokenizer;     /**  * 获取系统信息的业务逻辑实现类.  * @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 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;       }            /**     测试方法.       * @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");       }   }         其中,Bytes类用来处理字符串        public 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;       }   }   


下载地址:http://download.csdn.net/download/ardo_pass/10123846

阅读全文
0 0
原创粉丝点击