sigar进行JAVA后台系统资源监控错误
2015-10-30 17:56
465 查看
开发环境是Spring 4.1+Mybatis 3.2.8。sigar-1.6.4用来对系统资源进行检测和报告。
在程序运行的初期是没问题,但是当内存占用到80%时就会发现错误,之后就是周期性的报错。错误信息一长串,有用的部分如下:
严重: Servlet.service() for servlet [springmvc] in context with path [/Haiwan] threw exception [Handler processing failed; nested exception is java.lang.UnsatisfiedLinkError: org.hyperic.sigar.Mem.gather(Lorg/hyperic/sigar/Sigar;)V]
with root cause
java.lang.UnsatisfiedLinkError: org.hyperic.sigar.Mem.gather(Lorg/hyperic/sigar/Sigar;)V
at org.hyperic.sigar.Mem.gather(Native Method)
at org.hyperic.sigar.Mem.fetch(Mem.java:30)
at org.hyperic.sigar.Sigar.getMem(Sigar.java:304)
at com.haiwan.util.SystemInfo.usage(SystemInfo.java:95)
at com.haiwan.controller.system.MonitorController.usage(MonitorController.java:73)
从第三行,我们可以看出,这是由于JVM在连接Sigar时出了错。
但问题也在这里:为什么刚开始可以正确运行呢?
查了相关资料,可以知道,这是一个JNI调用的问题。
只是由于需要检测系统信息,所以需要将调用的动态库放置到JVM的调用路径下去。
也就是
String path=System.getProperty("java.library.path");
path中第一个 ;前的位置(即你的java jdk的bin目录下)。
具体的动态库,在Windows下是这三个鬼:
sigar-amd64-winnt.dll
sigar-x86-winnt.dll
sigar-x86-winnt.lib
好了,到此为止,问题解决。
其他系统需要另行选择,库的列表如下:
lib/libsigar-amd64-freebsd-6.so
lib/libsigar-amd64-linux.so
lib/libsigar-amd64-solaris.so
lib/libsigar-ia64-hpux-11.sl
lib/libsigar-ia64-linux.so
lib/libsigar-pa-hpux-11.sl
lib/libsigar-ppc64-aix-5.so
lib/libsigar-ppc64-linux.so
lib/libsigar-ppc-aix-5.so
lib/libsigar-ppc-linux.so
lib/libsigar-s390x-linux.so
lib/libsigar-sparc64-solaris.so
lib/libsigar-sparc-solaris.so
lib/libsigar-universal64-macosx.dylib
lib/libsigar-universal-macosx.dylib
lib/libsigar-x86-freebsd-5.so
lib/libsigar-x86-freebsd-6.so
lib/libsigar-x86-linux.so
lib/libsigar-x86-solaris.so
PS:Sigar介绍
Sigar(System Information Gatherer And Reporter),是一个开源的工具,提供了跨平台的系统信息收集的API,核心由C语言实现的。
可以被以下语音调用:
C/C++
Java (sigar.jar auto-loads the native library)
Perl (requires bindings/perl build)
.NET C# (requires bindings/csharp build)
Ruby (requires bindings/ruby build)
Python (requires bindings/python build)
PHP (requires bindings/php build)
Erlang (requires bindings/erl build)
可以收集的信息包括:
1, CPU信息,包括基本信息(vendor、model、mhz、cacheSize)和统计信息(user、sys、idle、nice、wait)
2, 文件系统信息,包括Filesystem、Size、Used、Avail、Use%、Type
3, 事件信息,类似Service Control Manager
4, 内存信息,物理内存和交换内存的总数、使用数、剩余数;RAM的大小
5, 网络信息,包括网络接口信息和网络路由信息
6, 进程信息,包括每个进程的内存、CPU占用数、状态、参数、句柄
7, IO信息,包括IO的状态,读写大小等
8, 服务状态信息
9, 系统信息,包括操作系统版本,系统资源限制情况,系统运行时间以及负载,JAVA的版本信息等.
在程序运行的初期是没问题,但是当内存占用到80%时就会发现错误,之后就是周期性的报错。错误信息一长串,有用的部分如下:
严重: Servlet.service() for servlet [springmvc] in context with path [/Haiwan] threw exception [Handler processing failed; nested exception is java.lang.UnsatisfiedLinkError: org.hyperic.sigar.Mem.gather(Lorg/hyperic/sigar/Sigar;)V]
with root cause
java.lang.UnsatisfiedLinkError: org.hyperic.sigar.Mem.gather(Lorg/hyperic/sigar/Sigar;)V
at org.hyperic.sigar.Mem.gather(Native Method)
at org.hyperic.sigar.Mem.fetch(Mem.java:30)
at org.hyperic.sigar.Sigar.getMem(Sigar.java:304)
at com.haiwan.util.SystemInfo.usage(SystemInfo.java:95)
at com.haiwan.controller.system.MonitorController.usage(MonitorController.java:73)
从第三行,我们可以看出,这是由于JVM在连接Sigar时出了错。
但问题也在这里:为什么刚开始可以正确运行呢?
查了相关资料,可以知道,这是一个JNI调用的问题。
只是由于需要检测系统信息,所以需要将调用的动态库放置到JVM的调用路径下去。
也就是
String path=System.getProperty("java.library.path");
path中第一个 ;前的位置(即你的java jdk的bin目录下)。
具体的动态库,在Windows下是这三个鬼:
sigar-amd64-winnt.dll
sigar-x86-winnt.dll
sigar-x86-winnt.lib
好了,到此为止,问题解决。
其他系统需要另行选择,库的列表如下:
lib/libsigar-amd64-freebsd-6.so
lib/libsigar-amd64-linux.so
lib/libsigar-amd64-solaris.so
lib/libsigar-ia64-hpux-11.sl
lib/libsigar-ia64-linux.so
lib/libsigar-pa-hpux-11.sl
lib/libsigar-ppc64-aix-5.so
lib/libsigar-ppc64-linux.so
lib/libsigar-ppc-aix-5.so
lib/libsigar-ppc-linux.so
lib/libsigar-s390x-linux.so
lib/libsigar-sparc64-solaris.so
lib/libsigar-sparc-solaris.so
lib/libsigar-universal64-macosx.dylib
lib/libsigar-universal-macosx.dylib
lib/libsigar-x86-freebsd-5.so
lib/libsigar-x86-freebsd-6.so
lib/libsigar-x86-linux.so
lib/libsigar-x86-solaris.so
PS:Sigar介绍
Sigar(System Information Gatherer And Reporter),是一个开源的工具,提供了跨平台的系统信息收集的API,核心由C语言实现的。
可以被以下语音调用:
C/C++
Java (sigar.jar auto-loads the native library)
Perl (requires bindings/perl build)
.NET C# (requires bindings/csharp build)
Ruby (requires bindings/ruby build)
Python (requires bindings/python build)
PHP (requires bindings/php build)
Erlang (requires bindings/erl build)
可以收集的信息包括:
1, CPU信息,包括基本信息(vendor、model、mhz、cacheSize)和统计信息(user、sys、idle、nice、wait)
2, 文件系统信息,包括Filesystem、Size、Used、Avail、Use%、Type
3, 事件信息,类似Service Control Manager
4, 内存信息,物理内存和交换内存的总数、使用数、剩余数;RAM的大小
5, 网络信息,包括网络接口信息和网络路由信息
6, 进程信息,包括每个进程的内存、CPU占用数、状态、参数、句柄
7, IO信息,包括IO的状态,读写大小等
8, 服务状态信息
9, 系统信息,包括操作系统版本,系统资源限制情况,系统运行时间以及负载,JAVA的版本信息等.
相关文章推荐
- java equals方法与==比较
- eclipse导出jar包
- 开源 java CMS - FreeCMS2.4字典管理
- 给定n个矩阵{A1, A2, …,An},其中,Ai与Ai+1是可乘的,计算这n个矩阵的连乘积。从中找出一种乘次数最少的计算次序(矩阵连乘最优顺序Java语言实现
- java中的HashSet和TreeSet的区别,以及HashSet导致的内存泄漏详解
- 【Struts】strust.xml中<result type="">所有类型详解
- java文件上传下载
- java中判断任何一个整数区间的素数的个数,并输出所有的素数
- SpringMVC文件上传和下载
- 解决eclipse插件svn不显示svn信息和显示的信息为数字的问题
- 解决eclipse插件svn不显示svn信息和显示的信息为数字的问题
- 解决eclipse插件svn不显示svn信息和显示的信息为数字的问题
- javaweb文件上传下载
- java的几种对象(PO,VO,DAO,BO,POJO)解释
- Struts2工作原理
- java匿名内部类
- struts2文件上传下载
- spring4整合dwr3
- springMVC文件上传下载
- 举例讲解Java中do-while语句的使用方法