mojianpo 发表于 2013-1-15 02:16:56

java 操作系统相关参数获取

import java.io.BufferedReader;
import java.io.File;
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;


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 - c0;   
                long busytime = c1 - c0;   
                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;   
      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 = idletime;   
            retn = kneltime + usertime;   
            return retn;   
      } catch (Exception ex) {   
            ex.printStackTrace();   
      } finally {   
            try {   
                proc.getInputStream().close();   
            } catch (Exception e) {   
                e.printStackTrace();   
            }   
      }   
      return null;   
    }   

   
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");   

}   

}

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;   
    }   
}

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;   
    }   
}   


interface IMonitorService {   
    public MonitorInfoBean getMonitorInfoBean() throws Exception;   

}
页: [1]
查看完整版本: java 操作系统相关参数获取