java取得Linuxcpu,内存,磁盘实时信息

Java代码
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、内存信息 
*  
* */ 
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));  
   }  
}  
 
/** 
* 测试类 
*  
* <p>@author javer QQ:84831612</p> 
* @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());  
    }  
}

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、内存信息
*
* */
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));
   }
}

/**
* 测试类
*
* <p>@author javer QQ:84831612</p>
* @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());
    }
} (http://people.ee.ethz.ch/~oetiker/webtools/mrtg/)就是一个很不错的选择。不过用mrtg就要装sysstat、apache、snmp、perl之类的东西。而且安装也要好几个步骤,似乎比较麻烦。本来也想直接调用sar、vmstat之类的命令,parse一下结果就算了。哪知道发现不同的版本的linux这些命令的结果也都是不一样。既然要按版本 parse它们的结果,那还不如直接去系统里面获得算了。于是研究了一下sysstat(http://freshmeat.net/projects/sysstat/)和gkrellm(http://gkrellm.net )的源代码,找到监测性能的数据所在。

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里面获得。同样也是需要两次取值取其差作为流量值。

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论

转载于:https://www.cnblogs.com/beyondwcm/archive/2008/09/22/1296174.html

[转]java取得Linuxcpu,内存,磁盘实时信息相关推荐

  1. java linux获取实时cpu_用java取得linux系统cpu、内存的实时信息(参考别人代码)...

    /** *     cat /proc/cpuinfo - cpu (i.e. vendor, mhz, flags like mmx)     *     cat /proc/interrupts ...

  2. Java如何获取系统cpu、内存、硬盘信息

    1 概述 前段时间摸索在Java中怎么获取系统信息包括cpu.内存.硬盘信息等,刚开始使用Java自带的包进行获取,但这样获取的内存信息不够准确并且容易出现找不到相应包等错误,所以后面使用sigar插 ...

  3. 整理linux 查看操作系统、CPU、内存、磁盘等信息

    整理linux 查看操作系统.CPU.内存.磁盘等信息 一.查看 cpu 信息 1 . 所 有 信 息 lscpu [root@localhost ~]# lscpu Architecture: x8 ...

  4. 常用Linux网络/内存/磁盘分析工具

    Centos查看网卡.CPU.内存等使用率 # watch more /proc/net/dev 性能分析和监控工具 uptime dmesg | tail vmstat 1 mpstat -P AL ...

  5. Java进阶 JVM 内存与垃圾回收篇(一)

    JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...

  6. linux查cpu和内存配置,Linux查看CPU和内存的配置信息

    CPU配置信息: frank@ubuntu:~/test/python$ cat /proc/cpuinfo processor : #系统中逻辑处理核的编号 vendor_id : GenuineI ...

  7. java 什么是内存屏障,java内存屏障和可见性

    内存屏障 由于现代的操作系统都是多处理器.而每一个处理器都有自己的缓存,并且这些缓存并不是实时都与内存发生信息交换.这样就可能出现一个cpu上的缓存数据与另一个cpu上的缓存数据不一致的问题.而这样在 ...

  8. java cpu监控,java系统监控CPU 磁盘

    java系统监控CPU 磁盘 import java.io.*; /** * linux 下cpu 内存 磁盘 jvm的使用监控 * @author avery_leo * */ public cla ...

  9. 内存映射文件 写入 卡住_在Java中使用内存映射文件时检测(写入)失败

    内存映射文件 写入 卡住 内存映射文件是一个很好的并且经常被忽视的工具. 我不会在这里详细介绍它们的工作方式(使用 力 Google Luke!),但我将快速总结其优势: 操作系统提供的延迟加载和写入 ...

最新文章

  1. cannot resolve symbol ‘R‘ 程序包R不存在
  2. lnmp环境脚本自动配置
  3. CCP(Cost complexity pruning) on sklearn with python implemention
  4. mysql 递归_「MySQL」 - SQL Cheat Sheet - 未完成
  5. 基于阿里云的 Node.js 稳定性实践
  6. Spring Boot笔记-发送纯字符串邮件及带附件邮件
  7. [转]VS 2003 常用快捷键
  8. 求一列数据中的波峰_pandas查看缺失数据占比(实战)
  9. python 直线过滤掉不在边缘上的点_不存在所谓的机器学习平台
  10. python猴子选大王讲解_关于猴子选大王的面试题
  11. ssm整合之配置applicationContext-service.xml
  12. Linux字体最好看的发行版,如何给任意一款 Linux 发行版添加漂亮的字体
  13. Python 3——xlsxwriter生成图表
  14. iOS UI 自动化测试原理以及在 Trip.com 的应用实践
  15. 2021物联网国赛zigbee点对点通讯——G卷
  16. 你已经是智能机器人,该上岗新基建了
  17. Excel-图例文本如何修改
  18. 乐观锁和悲观锁区别以及使用场景
  19. Android中安装ADB工具
  20. 江苏省徐州市科目三考场分析

热门文章

  1. 归并排序(非递归,Java实现)
  2. Gym - 101334F 单调栈
  3. 【LeetCode】排序
  4. 解读:MR多路径输入
  5. 使用 FOR XML PATH 合并SQL Server查询结果的重复行
  6. ASP.NET中文件上传下载方法集合
  7. 运用深度学习教机器人理解自然语言
  8. 纯CSS实现立方体旋转
  9. home目录迁移至新分区
  10. oracle中类似indexof用法_instr函数