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