日期:2014-05-16 浏览次数:20806 次
前些天正好需要完成一个实时分析linux系统CPU、内存使用情况的功能,类似于windows任务管理器的那种。当时搜了很多帖子出来,有些比较深刻,但是用Java调用起来比较麻烦,又要用jni、又要写C,在万般无奈之下翻阅了一些linux的相关资料,竟然得知linux系统中/proc/目录下有存放系统信息的文件,大喜过望啊!? @author javer QQ:84831612 @author javer QQ:84831612
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、内存信息?
*?
*
* @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));?
}?
}?
/**?
* 测试类?
*?
*
* @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());?
}?
}?