转载-实时候析linux系统CPU、内存使用情况

转载-实时分析linux系统CPU、内存使用情况

前些天正好需要完成一个实时分析linux系统CPU、内存使用情况的功能,类似于windows任务管理器的那种。当时搜了很多帖子出来,有些比较深刻,但是用Java调用起来比较麻烦,又要用jni、又要写C,在万般无奈之下翻阅了一些linux的相关资料,竟然得知linux系统中/proc/目录下有存放系统信息的文件,大喜过望啊! 


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

/** 
* 取得linux系统下的cpu、内存信息 

*

@author javer QQ:84831612


* @date 2005 
*/ 
public final class 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 
*/ 
public static int[] getMemInfo() throws IOException, InterruptedException 

File file = new File("/proc/meminfo"); 
BufferedReader br = new BufferedReader(new InputStreamReader( 
new FileInputStream(file))); 
int[] result = new int[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()); 
else if(str.equalsIgnoreCase("MemFree:")) 
result[1] = Integer.parseInt(token.nextToken()); 
else if(str.equalsIgnoreCase("SwapTotal:")) 
result[2] = Integer.parseInt(token.nextToken()); 
else if(str.equalsIgnoreCase("SwapFree:")) 
result[3] = Integer.parseInt(token.nextToken()); 


return result; 


/** 
* get memory by used info 

* @return float efficiency 
* @throws IOException 
* @throws InterruptedException 
*/ 
public static float 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(1000); 

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


/** 
* 测试类 

*

@author javer QQ:84831612


* @date 2005 
*/ 
public class JaverTest 

public static void 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());