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;

/**
 * 测试类
 
*/

public   class  Test  {
  
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());
  }

}


/**
 * <p>Title: LinuxSystemTool</p>
 *
 * <p>Description:  取得linux系统下的cpu、内存信息</p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: wri</p>
 *
 * @tang
 * 
@version 1.0
 
*/

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

}


     

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值