java获得CPU使用率,系统内存,虚拟机内存等情况(不用JNI)
2009年10月23日 星期五 16:30
在Java中,可以获得总的物理内存、剩余的物理内存、已使用的物理内存等信息,下面例子可以取得这些信息,并且获得在Windows下的内存使用率。 首先编写一个MonitorInfoBean类,用来装载监控的一些信息,包括物理内存、剩余的物理内存、已使用的物理内存、内存使用率等字段,该类的代码如下: package com.itor; 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) { alMemory = totalMemory; } public long getTotalMemorySize() { return totalMemorySize; } public void setTotalMemorySize(long totalMemorySize) { alMemorySize = totalMemorySize; } public int getTotalThread() { return totalThread; } public void setTotalThread(int totalThread) { alThread = 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; } } 接着编写一个获得当前的监控信息的接口,该类的代码如下所示: package com.itor; /** * 获取系统信息的业务逻辑类接口. */ 枣庄市中考成绩查询public interface IMonitorService { /** * 获得当前的监控对象. * @return 返回构造好的监控对象 * @throws Exception */ public MonitorInfoBean getMonitorInfoBean() throws Exception; } 该类的实现类MonitorServiceImpl如下所示: package com.itor; import java.io.BufferedReader; 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; /** * * 获取系统信息的业务逻辑实现类. * * @author GuoHuang */ public class MonitorServiceImpl implements IMonitorService { private static final int CPUTIME = 30; 快乐大本营20100501 private static final int PERCENT = 100; private static final int FAULTLENGTH = 10; private static String linuxVersion = null; /** * 获得当前的监控对象. * * @return 返回构造好的监控对象 * @throws Exception * @author GuoHuang */ public MonitorInfoBean getMonitorInfoBean() throws Exception { int kb = 1024; // 可使用内存 long totalMemory = Runtime().totalMemory() / kb; // 剩余内存 long freeMemory = Runtime().freeMemory() / kb; // 最大可使用内存 long maxMemory = Runtime().maxMemory() / kb; OperatingSystemMXBean osmxb = (OperatingSystemMXBean) OperatingSystemMXBean(); // 操作系统 String osName = Property("os.name"); // 总的物理内存 long totalMemorySize = TotalPhysicalMemorySize() / kb; // 剩余的物理内存 long freePhysicalMemorySize = FreePhysicalMemorySize() / kb; // 已使用的物理内存 long usedMemory = (TotalPhysicalMemorySize() - FreePhysicalMemorySize()) / kb; // 获得线程总数 ThreadGroup parentThread; for (parentThread = Thread.currentThread().getThreadGroup(); Parent() != null; parentThread = Parent()); int totalThread = parentThread.activeCount(); double cpuRatio = 0; if (LowerCase().startsWith("windows")) { cpuRatio = CpuRatioForWindows(); } else {原神角推荐 cpuRatio = 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().exec("top -b -n 1"); is = InputStream(); isr = new InputStreamReader(is); brStat = new BufferedReader(isr); if (linuxVersion.equals("2.4")) { adLine(); adLine(); adLine(); adLine(); tokenStat = new adLine()); Token(); Token(); String user = Token(); Token(); String system = Token(); Token(); String nice = Token(); 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 { adLine(); adLine(); tokenStat = new adLine()); Token(); Token(); Token(); Token(); Token(); Token(); Token(); String cpuUsage = Token(); 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.Message()); 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) 几号入伏2020几号入伏 isr.close(); if (br != null) br.close(); } catch (IOException ioe) { System.out.Message()); } } /** * 获得CPU使用率. * * @return 返回cpu使用率 * @author GuoHuang */ private double getCpuRatioForWindows() { try { String procCmd = v("windir") + "\\system32\\wbem\\ process get Caption,CommandLine,KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount"; // 取进程信息 long[] c0 = Runtime().exec(procCmd)); Thread.sleep(CPUTIME); long[] c1 = Runtime().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 { OutputStream().close(); InputStreamReader ir = new InputStream()); LineNumberReader input = new LineNumberReader(ir); String line = adLine(); 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 = adLine()) != 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("") >= 0) { continue; } String s1 = Bytes.substring(line, kmtidx, rocidx - 1).trim(); String s2 = Bytes.substring(line, umtidx, wocidx - 1).trim(); if (caption.equals("System Idle Process") || caption.equals("System")) { if (s1.length() > 0) idletime += Long.valueOf(s1).longValue(); if (s2.length() > 0) idletime += Long.valueOf(s2).longValue(); continue; } if (s1.length() > 0) kneltime += Long.valueOf(s1).longValue(); if (s2.length() > 0) usertime += Long.valueOf(s2).longValue(); } retn[0] = idletime; retn[1] = kneltime + usertime; return retn; } catch (Exception ex) { ex.printStackTrace(); } finally { try { InputStream().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 = MonitorInfoBean(); System.out.println("cpu占有率=" + CpuRatio()); System.out.println("可使用内存=" + TotalMemory()); System.out.println("剩余内存=" + FreeMemory()); System.out.println("最大可使用内存=" + MaxMemory()); System.out.println("操作系统=" + OsName()); System.out.println("总的物理内存=" + TotalMemorySize() + "kb"); System.out.println("剩余的物理内存=" + FreeMemory() + "kb"); System.out.println("已使用的物理内存=" + UsedMemory() + "kb"); System.out.println("线程总数=" + TotalThread() + "kb"); } } 该实现类中需要用到一个自己编写byte的工具类,该类的代码如下所示: package com.itor; /** * byte操作类. */ public class Bytes { /** * 由于String.subString对汉字处理存在问题(把一个汉字视为一个字节),因此在 包含汉字的字符串时存在隐患,现调整如下: * * @param src 要截取的字符串 * @param start_idx 开始坐标(包括该坐标) * @param end_idx 截止坐标(包括该坐标) * @return */ public static String substring(String src, int start_idx, int end_idx) {人力资源的六大板块 byte[] b = Bytes(); String tgt = ""; for (int i = start_idx; i <= end_idx; i++) { tgt += (char) b[i]; } return tgt; } } 运行下MonitorBeanImpl类,读者将会看到当前的内存、cpu利用率等信息。就算候鸟已南飞 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论