java 獲取服務器CPU、內存、硬盤使用量

java 獲取服務器CPU、內存、硬盤使用量


/** 
 * <獲取系統信息類> 
 * <獲取系統信息,如CPU、內存、硬盤使用情況> 
 * @author  wenkaixuan 
 * @version  [版本號, 2012-5-9] 
 * @see  [相關類/方法] 
 * @since  [產品/模塊版本] 
 */  
public class GetSystemInfo  
{  
    private static final int CPUTIME = 500;  
      
    private static final int PERCENT = 100;  
      
    private static final int FAULTLENGTH = 10;  
      
    //獲取內存使用率  
    public static String getMemery()  
    {  
        OperatingSystemMXBean osmxb = (OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();  
        // 總的物理內存+虛擬內存  
        long totalvirtualMemory = osmxb.getTotalSwapSpaceSize();  
        // 剩餘的物理內存  
        long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize();  
        Double compare = (Double)(1 - freePhysicalMemorySize * 1.0 / totalvirtualMemory) * 100;  
        String str = "內存已使用:" + compare.intValue() + "%";  
        return str;  
    }  
      
    //獲取文件系統使用率  
    public static List<String> getDisk()  
    {  
        // 操作系統  
        List<String> list = new ArrayList<String>();  
        for (char c = 'A'; c <= 'Z'; c++)  
        {  
            String dirName = c + ":/";  
            File win = new File(dirName);  
            if (win.exists())  
            {  
                long total = (long)win.getTotalSpace();  
                long free = (long)win.getFreeSpace();  
                Double compare = (Double)(1 - free * 1.0 / total) * 100;  
                String str = c + ":盤  已使用 " + compare.intValue() + "%";  
                list.add(str);  
            }  
        }  
        return list;  
    }  
      
    //獲得cpu使用率  
    public static String 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 "CPU使用率:" + Double.valueOf(PERCENT * (busytime) * 1.0 / (busytime + idletime)).intValue() + "%";  
            }  
            else  
            {  
                return "CPU使用率:" + 0 + "%";  
            }  
        }  
        catch (Exception ex)  
        {  
            ex.printStackTrace();  
            return "CPU使用率:" + 0 + "%";  
        }  
    }  
      
    //讀取cpu相關信息  
    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;  
            }  
            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 = substring(line, capidx, cmdidx - 1).trim();  
                String cmd = substring(line, cmdidx, kmtidx - 1).trim();  
                if (cmd.indexOf("wmic.exe") >= 0)  
                {  
                    continue;  
                }  
                String s1 = substring(line, kmtidx, rocidx - 1).trim();  
                String s2 = 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  
            {  
                proc.getInputStream().close();  
            }  
            catch (Exception e)  
            {  
                e.printStackTrace();  
            }  
        }  
        return null;  
    }  
      
    /** 
    * 由於String.subString對漢字處理存在問題(把一個漢字視爲一個字節),因此在 包含漢字的字符串時存在隱患,現調整如下: 
    * @param src 要截取的字符串 
    * @param start_idx 開始座標(包括該座標) 
    * @param end_idx 截止座標(包括該座標) 
    * @return 
    */  
    private 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;  
    }  
轉自:http://lengchaotian.iteye.com/blog/1588961

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章