1. 程式人生 > >java對Linux系統的CPU利用率的計算和記憶體資訊的獲取

java對Linux系統的CPU利用率的計算和記憶體資訊的獲取

       程序檔案系統,procfs,是一個偽檔案系統,它允許對一些非傳統意義上的檔案通過標準檔案I/O介面進行訪問。procfs將Solaris核心程序架構進行了抽象,當前系統中所有執行著的程序會在/proc/目錄下有所體現。/proc/目錄下的物件不是真實磁碟檔案,這些物件位於核心記憶體中,使用者執行ls(1)命令顯示/proc/目錄結構時,系統讀取核心記憶體並返回相應內容。 因此我們可以利用它來計算CPU利用率和記憶體資訊。

CPU利用率的計算方法:

總利用率: /proc/stat中的第一行;
每個CPU的利用率:/proc/stat中第二行從cpu0開始,如果只有一個CPU,那就只有cpu0
資訊獲取方法:
注意cpux:後面有4列數字,依次是user, nice, sys, idle的數值。
對這個檔案需要讀取兩遍,我們用total表示累計總資源,那麼user+sys就是我們想要知道的累計CPU佔用的資源。每個變數後面的數字表示它是第幾次讀檔案得到的,用如下方法可算出CPU佔用率:IntCpuRate =(int)rintf(((float)((user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1))/(float)(total_2 - total_1) )*100) 。

由於兩次讀取的時間間隔比較短,就近似的認為這就是即時的CPU利用率。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**
 * 測試類
 
*/

publicclass Test {
  
publicstaticvoid main(String[] args) throws Exception 
{
    
int[] memInfo = LinuxSystemTool.getMemInfo();
    System.out.println(
"MemTotal:"+ memInfo[0]);
    System.out.println(
"MemFree:"+ memInfo[1]);
    System.out.println(
"SwapTotal:"+ memInfo[2]);
    System.out.println(
"SwapFree:"+ memInfo[3]);

    System.out.println(
"CPU利用率:"+ LinuxSystemTool.getCpuInfo());
  }

}


/**
 * <p>Title: LinuxSystemTool</p>
 *
 * <p>Description:  取得linux系統下的cpu、記憶體資訊</p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: wri</p>
 *
 * @tang
 * 
@version 1.0
 
*/

finalclass LinuxSystemTool {
  
/**
   * get memory by used info
   * 
@return int[] result
   * result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree;
   * 
@throws IOException
   * 
@throws InterruptedException
   
*/

  
publicstaticint[] getMemInfo() throws IOException, InterruptedException {
    File file 
=new File("/proc/meminfo");
    BufferedReader br 
=new BufferedReader(new InputStreamReader(
        
new FileInputStream(file)));
    
int[] result =newint[4];
    String str 
=null;
    StringTokenizer token 
=null;
    
while ( (str = br.readLine()) !=null{
      token 
=new StringTokenizer(str);
      
if (!token.hasMoreTokens()) {
        
continue;
      }


      str 
= token.nextToken();
      
if (!token.hasMoreTokens()) {
        
continue;
      }


      
if (str.equalsIgnoreCase("MemTotal:")) {
        result[
0= Integer.parseInt(token.nextToken());
      }

      
elseif (str.equalsIgnoreCase("MemFree:")) {
        result[
1= Integer.parseInt(token.nextToken());
      }

      
elseif (str.equalsIgnoreCase("SwapTotal:")) {
        result[
2= Integer.parseInt(token.nextToken());
      }

      
elseif (str.equalsIgnoreCase("SwapFree:")) {
        result[
3= Integer.parseInt(token.nextToken());
      }

    }


    
return result;
  }


  
/**
   * get memory by used info
   *
   * 
@return float efficiency
   * 
@throws IOException
   * 
@throws InterruptedException
   
*/

  
publicstaticfloat getCpuInfo() throws IOException, InterruptedException {
    File file 
=new File("/proc/stat");
    BufferedReader br 
=new BufferedReader(new InputStreamReader(
        
new FileInputStream(file)));
    StringTokenizer token 
=new StringTokenizer(br.readLine());
    token.nextToken();
    
int user1 = Integer.parseInt(token.nextToken());
    
int nice1 = Integer.parseInt(token.nextToken());
    
int sys1 = Integer.parseInt(token.nextToken());
    
int idle1 = Integer.parseInt(token.nextToken());

    Thread.sleep(
3000);

    br 
=new BufferedReader(
        
new InputStreamReader(new FileInputStream(file)));
    token 
=new StringTokenizer(br.readLine());
    token.nextToken();
    
int user2 = Integer.parseInt(token.nextToken());
    
int nice2 = Integer.parseInt(token.nextToken());
    
int sys2 = Integer.parseInt(token.nextToken());
    
int idle2 = Integer.parseInt(token.nextToken());

    
return (float) ( (user2 + sys2 + nice2) - (user1 + sys1 + nice1)) /
        (
float) ( (user2 + nice2 + sys2 + idle2) -
                 (user1 
+ nice1 + sys1 + idle1));
  }

}