首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

java取得CPU、系统内存情况

2012-06-27 
java获得CPU、系统内存情况java获得CPU、系统内存情况?JXM:Monitoring and Management Interface for the Ja

java获得CPU、系统内存情况
java获得CPU、系统内存情况?

JXM:Monitoring and Management Interface for the Java? Platform

通过jmx可以监控vm内存使用,系统内存使用等

以下是网上某博客代码,特点是通过window和linux命令获得CPU使用率。?

?

Java代码
    ???利用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[i];? ?? ????????}? ?? ????????return?tgt;? ?? ????}? ?? }??

热点排行