java對Linux系統的CPU利用率的計算和記憶體資訊的獲取
阿新 • • 發佈:2019-01-22
程序檔案系統,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.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));
}
}