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文件再獲取系統信息時就不會報錯了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章