我的日常

登录/注册
您现在的位置:论坛 资料库 JAVA开发 > java获得CPU使用率,系统内存,虚拟机内存等情况(上)
总共48087条微博

动态微博

查看: 1437|回复: 0

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

[复制链接]

72

主题

0

听众

1034

金钱

五袋长老

该用户从未签到

90后

跳转到指定楼层
楼主
发表于 2015-04-24 09:16:27 |只看该作者 |倒序浏览
通过jmx可以监控vm内存使用,系统内存使用等
以下是网上某博客代码,特点是通过window和linux命令获得CPU使用率。
java代码  [url=][/url]

  •    利用java程序实现获取计算机cpu利用率和内存使用信息。   
  •   
  •     创建一个Bean用来存贮要得到的信   
  •   
  • 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;   
  •     }   
  • }   


MonitorInfoBean.java

14.46 KB, 下载次数: 2


科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

呵呵,呵呵
快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表