1. 程式人生 > >sigar進行JAVA後臺系統資源監控錯誤

sigar進行JAVA後臺系統資源監控錯誤

開發環境是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的版本資訊等.