package com.jd.pop.module.utils;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.LineNumberReader;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.StringTokenizer;/** * 操作系统工具类 * @author modi * */public class OSUtils {// String osName = System.getProperty("os.name"); // if (osName.toLowerCase().startsWith("windows")) { // cpuRatio = this.getCpuRatioForWindows(); // } private static final int CPUTIME = 500;//采集频率 private static final int FAULTLENGTH = 10; /** * 获取cpu使用率 *1表示100% * @return */ public static double getCpuRatio(){ double cpuRatio = -1; String osName = System.getProperty("os.name"); if (osName.toLowerCase().startsWith("windows")) { cpuRatio = getCpuRatioForWindows(); }else{ cpuRatio = getCpuRatioForLinux(); } return cpuRatio; } // 获得cpu使用率 public static double getCpuRatioForWindows() { try { String procCmd = System.getenv("windir") + "\\system32\\wbem\\wmic.exe process get Caption, KernelModeTime, UserModeTime";// 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(busytime)/(busytime + idletime); } else { return 0; } } catch (Exception ex) { ex.printStackTrace(); return -1; } } private static 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; } // Caption, KernelModeTime, UserModeTime int capidx = line.indexOf("Caption"); int kmtidx = line.indexOf("KernelModeTime"); int umtidx = line.indexOf("UserModeTime"); long idletime = 0; long kneltime = 0; long usertime = 0; while ((line = input.readLine()) != null) { if (line.length() < umtidx) { continue; } // 字段出现顺序:Caption, KernelModeTime, UserModeTime String caption = Bytes.substring(line, capidx, kmtidx - 1).trim(); if (caption.toLowerCase().indexOf("wmic.exe") >= 0) { continue; } String s1 = Bytes.substring(line, kmtidx, umtidx - 1).trim(); String s2 = Bytes.substring(line, umtidx, line.length()-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 { proc.getInputStream().close(); } catch (Exception e) { e.printStackTrace(); } } return null; } static 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; } } /linux /** * 功能:获取Linux系统cpu使用率 * */ public static double getCpuRatioForLinux() { try { Map
map1 = OSUtils.cpuinfo(); Thread.sleep(CPUTIME); Map map2 = OSUtils.cpuinfo(); long user1 = Long.parseLong(map1.get("user").toString()); long nice1 = Long.parseLong(map1.get("nice").toString()); long system1 = Long.parseLong(map1.get("system").toString()); long idle1 = Long.parseLong(map1.get("idle").toString()); long user2 = Long.parseLong(map2.get("user").toString()); long nice2 = Long.parseLong(map2.get("nice").toString()); long system2 = Long.parseLong(map2.get("system").toString()); long idle2 = Long.parseLong(map2.get("idle").toString()); long total1 = user1 + system1 + nice1; long total2 = user2 + system2 + nice2; double total = total2 - total1; long totalIdle1 = user1 + nice1 + system1 + idle1; long totalIdle2 = user2 + nice2 + system2 + idle2; double totalidle = totalIdle2 - totalIdle1; return total / totalidle; } catch (InterruptedException e) { e.printStackTrace(); return -1; } } /** * 功能:CPU使用信息 * */ public static Map cpuinfo() { InputStreamReader inputs = null; BufferedReader buffer = null; Mapmap = new HashMap (); try { inputs = new InputStreamReader(new FileInputStream("/proc/stat")); buffer = new BufferedReader(inputs); String line = ""; while (true) { line = buffer.readLine(); if (line == null) { break; } if (line.startsWith("cpu")) { StringTokenizer tokenizer = new StringTokenizer(line); List temp = new ArrayList (); while (tokenizer.hasMoreElements()) { String value = tokenizer.nextToken(); temp.add(value); } map.put("user", temp.get(1)); map.put("nice", temp.get(2)); map.put("system", temp.get(3)); map.put("idle", temp.get(4)); map.put("iowait", temp.get(5)); map.put("irq", temp.get(6)); map.put("softirq", temp.get(7)); map.put("stealstolen", temp.get(8)); break; } } } catch (Exception e) { e.printStackTrace(); } finally { try { buffer.close(); inputs.close(); } catch (Exception e2) { e2.printStackTrace(); } } return map; } public static void main(String[] args) { while(true){// System.out.println("cpu占有率=" + WindowsInfoUtil.getCpuRatioForWindows()); System.out.println("cpu占有率=" + getCpuRatio()); } }}