java 获得CPU 内存信息

1、CPU



在文件"/proc/stat"里面就包含了CPU的信息。每一个CPU的每一tick用在什么地方都在这个文件里面记着。后面的数字含义分别是: user、nice、sys、idle、iowait。有些版本的kernel没有iowait这一项。这些数值表示从开机到现在,CPU的每tick用在了哪里。例如:

cpu0 256279030 0 11832528 1637168262

就是cpu0从开机到现在有 256279030 tick用在了user消耗,11832528用在了sys消耗。所以如果想计算单位时间(例如1s)里面CPU的负载,那只需要计算1秒前后数值的差除以每一秒的tick数量就可以了。gkrellm就是这样实现的:((200 * (v2 - v1) / CPU_TICKS_PER_SECOND) + 1) /2

例如,第一次读取/proc/stat,user的值是256279030;一秒以后再读一次,值是256289030,那么CPU在这一秒的user消耗就是:((200 * (256289030 - 256279030) / CPU_TICKS_PER_SECOND) + 1) /2 = ((10000 * 200 / 1000000) + 1) / 2 = 1%了。



2、内存消耗



文件"/proc/meminfo"里面包含的就是内存的信息,还包括了swap的信息。例如:





$ cat /proc/meminfo

total:    used:    free:  shared: buffers:  cached:
Mem:  1057009664 851668992 205340672        0 67616768 367820800
Swap: 2146787328 164429824 1982357504
MemTotal:      1032236 kB
MemFree:        200528 kB
MemShared:           0 kB
……

不过从gkrellm的源代码看,有些版本没有前面那两行统计的信息,只能够根据下面的Key: Value这种各式的数据收集。



3、磁盘空间



从gkrellm的源代码看,这个是一个很复杂的数据。磁盘分区的数据有可能分布在:/proc/mounts、/proc/diskstats、 /proc/partitions等等。而且如果想要检查某几个特定的路径,还需要通过mount、df等命令的帮助。为了减少麻烦,这个数据我就直接用 statfs函数直接获得了。



int statfs(const char *path, struct statfs *buf);

这个函数只需要输入需要检查的路径名称,就可以返回这个路径所在的分区的空间使用情况:

总空间:buf.f_bsize * buf.f_blocks

空余空间:buf.f_bsize * buf.f_bavail



4、磁盘I/O



磁盘I/O的数据也同样比较复杂,有些版本看/proc/diskstats,有些版本看/proc/partitions,还有些版本至今我也不知道在那里看……不过可以看到数据的版本也像CPU那样,需要隔一段时间取值,两次取值的差就是流量。



5、网络流量



网络流量也是五花八门,不过基本上都可以在/proc/net/dev里面获得。同样也是需要两次取值取其差作为流量值。

 

 

  1. Java代码 
  2. import java.io.BufferedReader;   
  3. import java.io.File;   
  4. import java.io.FileInputStream;   
  5. import java.io.IOException;   
  6. import java.io.InputStreamReader;   
  7. import java.util.StringTokenizer;   
  8.   
  9. /**  
  10. * 取得linux系统下的cpu、内存信息  
  11. *   
  12. * */  
  13. public final class LinuxSystemTool   
  14. {   
  15.    /**  
  16.    * get memory by used info  
  17.    *   
  18.    * @return int[] result  
  19.    * result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree;  
  20.    * @throws IOException  
  21.    * @throws InterruptedException  
  22.    */  
  23.    public static int[] getMemInfo() throws IOException, InterruptedException   
  24.    {   
  25.       File file = new File("/proc/meminfo");   
  26.       BufferedReader br = new BufferedReader(new InputStreamReader(   
  27.       new FileInputStream(file)));   
  28.       int[] result = new int[4];   
  29.       String str = null;   
  30.       StringTokenizer token = null;   
  31.       while((str = br.readLine()) != null)   
  32.       {   
  33.          token = new StringTokenizer(str);   
  34.          if(!token.hasMoreTokens())   
  35.             continue;   
  36.       
  37.          str = token.nextToken();   
  38.          if(!token.hasMoreTokens())   
  39.             continue;   
  40.       
  41.          if(str.equalsIgnoreCase("MemTotal:"))   
  42.             result[0] = Integer.parseInt(token.nextToken());   
  43.          else if(str.equalsIgnoreCase("MemFree:"))   
  44.             result[1] = Integer.parseInt(token.nextToken());   
  45.          else if(str.equalsIgnoreCase("SwapTotal:"))   
  46.             result[2] = Integer.parseInt(token.nextToken());   
  47.          else if(str.equalsIgnoreCase("SwapFree:"))   
  48.             result[3] = Integer.parseInt(token.nextToken());   
  49.       }   
  50.       
  51.       return result;   
  52.    }   
  53.   
  54.    /**  
  55.    * get memory by used info  
  56.    *   
  57.    * @return float efficiency  
  58.    * @throws IOException  
  59.    * @throws InterruptedException  
  60.    */  
  61.    public static float getCpuInfo() throws IOException, InterruptedException   
  62.    {   
  63.       File file = new File("/proc/stat");   
  64.       BufferedReader br = new BufferedReader(new InputStreamReader(   
  65.       new FileInputStream(file)));   
  66.       StringTokenizer token = new StringTokenizer(br.readLine());   
  67.       token.nextToken();   
  68.       int user1 = Integer.parseInt(token.nextToken());   
  69.       int nice1 = Integer.parseInt(token.nextToken());   
  70.       int sys1 = Integer.parseInt(token.nextToken());   
  71.       int idle1 = Integer.parseInt(token.nextToken());   
  72.       
  73.       Thread.sleep(1000);   
  74.   
  75.       br = new BufferedReader(   
  76.       new InputStreamReader(new FileInputStream(file)));   
  77.       token = new StringTokenizer(br.readLine());   
  78.       token.nextToken();   
  79.       int user2 = Integer.parseInt(token.nextToken());   
  80.       int nice2 = Integer.parseInt(token.nextToken());   
  81.       int sys2 = Integer.parseInt(token.nextToken());   
  82.       int idle2 = Integer.parseInt(token.nextToken());   
  83.   
  84.       return (float)((user2 + sys2 + nice2) - (user1 + sys1 + nice1)) / (float)((user2 + nice2 + sys2 + idle2) - (user1 + nice1 + sys1 + idle1));   
  85.    }   
  86. }   
  87.   
  88. /**  
  89. * 测试类  
  90. *   
  91. * <p>@author javer QQ:84831612</p>  
  92. * @date 2005  
  93. */  
  94. public class JaverTest   
  95. {   
  96.     public static void main(String[] args) throws Exception   
  97.     {   
  98.         int[] memInfo = LinuxSystemTool.getMemInfo();   
  99.         System.out.println("MemTotal:" + memInfo[0]);   
  100.         System.out.println("MemFree:" + memInfo[1]);   
  101.         System.out.println("SwapTotal:" + memInfo[2]);   
  102.         System.out.println("SwapFree:" + memInfo[3]);   
  103.   
  104.         System.out.println("CPU利用率:" + LinuxSystemTool.getCpuInfo());   
  105.     }   
  106. }  
  107. import java.io.BufferedReader; 
  108. import java.io.File; 
  109. import java.io.FileInputStream; 
  110. import java.io.IOException; 
  111. import java.io.InputStreamReader; 
  112. import java.util.StringTokenizer; 
  113. /** 
  114. * 取得linux系统下的cpu、内存信息 
  115. * */ 
  116. public final class LinuxSystemTool 
  117.    /** 
  118.    * get memory by used info 
  119.    * 
  120.    * @return int[] result 
  121.    * result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree; 
  122.    * @throws IOException 
  123.    * @throws InterruptedException 
  124.    */ 
  125.    public static int[] getMemInfo() throws IOException, InterruptedException 
  126.    { 
  127.       File file = new File("/proc/meminfo"); 
  128.       BufferedReader br = new BufferedReader(new InputStreamReader( 
  129.       new FileInputStream(file))); 
  130.       int[] result = new int[4]; 
  131.       String str = null
  132.       StringTokenizer token = null
  133.       while((str = br.readLine()) != null
  134.       { 
  135.          token = new StringTokenizer(str); 
  136.          if(!token.hasMoreTokens()) 
  137.             continue
  138.    
  139.          str = token.nextToken(); 
  140.          if(!token.hasMoreTokens()) 
  141.             continue
  142.    
  143.          if(str.equalsIgnoreCase("MemTotal:")) 
  144.             result[0] = Integer.parseInt(token.nextToken()); 
  145.          else if(str.equalsIgnoreCase("MemFree:")) 
  146.             result[1] = Integer.parseInt(token.nextToken()); 
  147.          else if(str.equalsIgnoreCase("SwapTotal:")) 
  148.             result[2] = Integer.parseInt(token.nextToken()); 
  149.          else if(str.equalsIgnoreCase("SwapFree:")) 
  150.             result[3] = Integer.parseInt(token.nextToken()); 
  151.       } 
  152.    
  153.       return result; 
  154.    } 
  155.    /** 
  156.    * get memory by used info 
  157.    * 
  158.    * @return float efficiency 
  159.    * @throws IOException 
  160.    * @throws InterruptedException 
  161.    */ 
  162.    public static float getCpuInfo() throws IOException, InterruptedException 
  163.    { 
  164.       File file = new File("/proc/stat"); 
  165.       BufferedReader br = new BufferedReader(new InputStreamReader( 
  166.       new FileInputStream(file))); 
  167.       StringTokenizer token = new StringTokenizer(br.readLine()); 
  168.       token.nextToken(); 
  169.       int user1 = Integer.parseInt(token.nextToken()); 
  170.       int nice1 = Integer.parseInt(token.nextToken()); 
  171.       int sys1 = Integer.parseInt(token.nextToken()); 
  172.       int idle1 = Integer.parseInt(token.nextToken()); 
  173.    
  174.       Thread.sleep(1000); 
  175.       br = new BufferedReader( 
  176.       new InputStreamReader(new FileInputStream(file))); 
  177.       token = new StringTokenizer(br.readLine()); 
  178.       token.nextToken(); 
  179.       int user2 = Integer.parseInt(token.nextToken()); 
  180.       int nice2 = Integer.parseInt(token.nextToken()); 
  181.       int sys2 = Integer.parseInt(token.nextToken()); 
  182.       int idle2 = Integer.parseInt(token.nextToken()); 
  183.       return (float)((user2 + sys2 + nice2) - (user1 + sys1 + nice1)) / (float)((user2 + nice2 + sys2 + idle2) - (user1 + nice1 + sys1 + idle1)); 
  184.    } 
  185. /** 
  186. * 测试类 
  187. * <p>@author javer QQ:84831612</p> 
  188. * @date 2005 
  189. */ 
  190. public class JaverTest 
  191.     public static void main(String[] args) throws Exception 
  192.     { 
  193.         int[] memInfo = LinuxSystemTool.getMemInfo(); 
  194.         System.out.println("MemTotal:" + memInfo[0]); 
  195.         System.out.println("MemFree:" + memInfo[1]); 
  196.         System.out.println("SwapTotal:" + memInfo[2]); 
  197.         System.out.println("SwapFree:" + memInfo[3]); 
  198.         System.out.println("CPU利用率:" + LinuxSystemTool.getCpuInfo()); 
  199.     } 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值