开发环境是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的版本信息等.