java程序获取系统资源--sigar的使用

我们有时候编写程序需要获取机器的各种信息,比如:CPU信息,内存信息,网络资源信息等。

Sigar是Hyperic-hq产品的基础包,是Hyperic HQ主要的数据收集组件。它用来从许多平台收集系统和处理信息.

这些平台包括:Linux, Windows, Solaris, AIX, HP-UX, FreeBSD and Mac OSX.

Sigar有C,C#,Java和Perl API,java版的API为sigar.jar sigar.jar的底层是用C语言编写的,它通过本地方法来调用操作系统API来获取系统相关数据。Windows操作系统下Sigar.jar 依赖sigar-amd64-winnt.dll或sigar-x86-winnt.dll,linux 操作系统下则依赖libsigar-amd64-linux.so或libsigar-x86-linux.so。


本文今天就来讨论一下sigar的使用。

Sigar.jar下载地址:http://sigar.hyperic.com

1. 获取内存信息

 Runtime r = Runtime.getRuntime();
//JVM可以使用的总内存
r.totalMemory();
 //JVM可以使用的剩余内存
 r.freeMemory();
直接使用java.lang.Runtime类中的方法即可。

2.获取CPU信息

//获取的一个sigar对象
Sigar sigar = new Sigar();
//CPU对象列表,因为一个机器现在也许不止一个CPU
CpuPerc cpuList[] = null;
try {
 //获得CPU对象列表
  CpuInfo infos[] = sigar.getCpuInfoList();
  cpuList = sigar.getCpuPercList();
//CPU的总频率
int totalMhz=0;
//已使用的频率
int usedMhz=0;
 for (int i = 0; i < infos.length; i++)
{
 CpuInfo info = infos[i];
 totalMhz+=info.getMhz();
 int used =(int)((double)info.getMhz()*(double)cpuList[i].getCombined());
 usedMhz+=used;
}
} catch (SigarException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


3. 获取网络信息

Sigar sigar = new Sigar(); //获取一个Sigar对象
String mac=*****;     //自己的mac地址。由于有些是虚拟网卡,我们要获取真正使用的物理网卡的带宽和使用率时必须通过mac地址比对才可以。
String ifNames[];
try {
	ifNames = sigar.getNetInterfaceList(); //获取网卡对象列表
	long receiveBytes1=0L;
	long sendBytes1=0L;
	long receiveBytes2=0L;
	long sendBytes2=0L;
	int speed=0; //网络带宽Mbps
	String name="";
	for (int i = 0; i < ifNames.length; i++) {
			name = ifNames[i];   //第i个网卡名
			NetInterfaceConfig ifconfig = sigar.getNetInterfaceConfig(name);//第i个网卡的配置信息
			if (mac.equals(ifconfig.getHwaddr())) {   //这里只获取我们指定的mac地址对应的物理网卡。
			   break;
			}
	}
	speed =(int) (sigar.getNetInterfaceStat(name).getSpeed()/1000000L); //获取该网卡的带宽,speed的单位是Mbps
	NetInterfaceStat ifstat = sigar.getNetInterfaceStat(name);   //获取该网卡的状态对象
	receiveBytes1=ifstat.getRxBytes();      //获取接受的字节数量
	sendBytes1=ifstat.getTxBytes();      //获取发送的字节数量
	long totalBytes1=receiveBytes1+sendBytes1;  //总的通信字节数量
    //以下是计算网络带宽,通过前一秒的通信字节数量和后一秒的通信字节数量的差值来计算该时刻的网络带宽
  long startTime = System.currentTimeMillis();
  try {
   Thread.sleep(1000);
	} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
	}
	NetInterfaceStat ifstat1 = sigar.getNetInterfaceStat(name);
	receiveBytes2=ifstat1.getRxBytes();
	sendBytes2=ifstat1.getTxBytes();
	long totalBytes2=receiveBytes2+sendBytes2;
	long endTime=System.currentTimeMillis();
	long totalBytes=totalBytes2-totalBytes1;
	float interval = (float)(endTime - startTime)/1000;  
 float curRate = (float)totalBytes*8/(1000000*interval);  //网络带宽
} catch (SigarException e1) {
		// TODO Auto-generated catch block
	e1.printStackTrace();
}	



4.关于使用sigar的JAVA程序打包成可运行的jar的问题

sigar在获取系统信息时调用了第三方dll库。所以在eclipse打包时也应该将dll打包到相应位置才能运行。具体流程如下:

1)在编写程序时,可将dll和sigar包一块儿放到lib文件夹里



2)打包jar文件



点击finish即可。

3)通过第二步打包,我们会在jar生成目录下发现除了.jar文件之外还有系统引用的第三方jar包文件夹: 项目名_lib,在项目名_lib下能看到sigar.jar包,程序运行时就调用该sigar.jar提供的接口。但是我们会发现sigar使用的.dll库文件并没有打包进来,所以直接运行打包的.jar程序获取系统信息时会报错的。解决方法是:将sigar使用的第三方库文件.dll放到 项目名.jar程序同级目录下。然后重新运行项目的jar文件再获取系统信息时就不会报错了。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值