java程序获取系统资源--sigar的使用
2017-10-30 10:28
691 查看
我们有时候编写程序需要获取机器的各种信息,比如: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
直接使用java.lang.Runtime类中的方法即可。
1)在编写程序时,可将dll和sigar包一块儿放到lib文件夹里
2)打包jar文件
点击finish即可。
3)通过第二步打包,我们会在jar生成目录下发现除了.jar文件之外还有系统引用的第三方jar包文件夹: 项目名_lib,在项目名_lib下能看到sigar.jar包,程序运行时就调用该sigar.jar提供的接口。但是我们会发现sigar使用的.dll库文件并没有打包进来,所以直接运行打包的.jar程序获取系统信息时会报错的。解决方法是:将sigar使用的第三方库文件.dll放到 项目名.jar程序同级目录下。然后重新运行项目的jar文件再获取系统信息时就不会报错了。
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文件再获取系统信息时就不会报错了。
相关文章推荐
- java项目中使用Sigar获取系统信息
- java使用sigar获取linux系统内存使用信息 注意事项
- 疯狂Java讲义中的程序,使用代理服务器来获取网上的资源
- java项目中使用Sigar获取系统信息
- 解决java使用sigar获取linux系统内存使用信息报错的问题
- 使用JAVA开发系统托盘程序
- 使用Java Service Wrapper 把Java程序作为Windows系统服务
- 使用JavaService让java程序加载为winNT系统服务
- 使用Java Service Wrapper 把Java程序作为Windows系统服务
- windows获取系统资源使用状况 和 放弃cpu
- AfxGetResourceHandle用于获取当前资源模块句柄,而AfxSetResourceHandle则用于设置程序目前要使用的资源模块句柄。
- Windows下使用Jconsole远程监控Linux系统中java服务器资源占用情况
- 在java程序中如何能获取到另一个程序的windows句柄,又如何使用这个句柄向这个窗口发送消息
- 使用JAVA开发系统托盘程序
- 使用Java Service Wrapper 把Java程序作为Windows系统服务
- 使用Java Service Wrapper 把Java程序作为Windows系统服务
- 使用Java Service Wrapper 把Java程序作为Windows系统服务
- C:\Windows\system32\MSVCR100.dll 没有被指定在 Windows 上运行,或者它包含错误。请尝试使用原始安装媒体重新安装程序,或联系您的系统管理员或软件供应商以获取支持。【解决办法】
- [解决方法]网络策略设置禁止您使用该网站获取您计算机的更新程序。 如果您确认此消息有误,请向您的系统管理员咨询。
- 使用Java实现B/S系统常见的获取客户端信息功能!