首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 使用 Sigar 獲取系統信息:常見載入失敗問題與極速解決方案

     編輯:Java 相關知識

前言

Sigar (System Information Gatherer And Reporter) 是一個強大的跨平台系統信息收集庫,通過 JNI 調用底層 C 實現,可獲取 CPU、內存、磁盤、網絡、進程等豐富指標。但初次使用時常遇到 UnsatisfiedLinkError,本文提供極速排查與解決方案。

Sigar 核心能力

  • CPU:廠商、型號、主頻、緩存、用戶/系統/空閒/等待時間
  • 文件系統:分區、類型、總量、已用、可用、使用率
  • 內存:物理/交換總量、已用、可用、RAM 大小
  • 網絡:接口信息、路由表、TCP/UDP 連接統計
  • 進程:PID、內存/CPU 佔用、狀態、參數、句柄、打開文件
  • 系統:OS 版本、資源限制、運行時間、負載、Java 版本

常見錯誤現象

Exception in thread "main" java.lang.UnsatisfiedLinkError: 
    no sigar-x86-winnt.dll in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
    at org.hyperic.sigar.Sigar.loadLibrary(Sigar.java:172)
    ...

原因: Java 找不到平台相關的動態鏈接庫(Windows 下為 sigar-x86-winnt.dll,Linux 為 libsigar-amd64-linux.so 等)。

極速解決三步走

步驟 1:下載完整分發包

官網:https://sigar.hyperic.com/ → 下載 hyperic-sigar-1.6.4.zip(或最新版)。解壓後目錄結構:

sigar-bin/
  lib/
    sigar.jar          ← Java API
    log4j-1.2.15.jar   ← 依賴
  lib/
    sigar-x86-winnt.dll           ← Windows 32 位
    sigar-amd64-winnt.dll         ← Windows 64 位
    libsigar-x86-linux.so         ← Linux 32 位
    libsigar-amd64-linux.so       ← Linux 64 位
    ... (其他平台)

步驟 2:配置 Java 項目依賴

  • sigar.jar、log4j.jar 加入 Classpath (Maven/Gradle 或手動導入 lib 目錄)。

步驟 3:部署原生庫 — 關鍵步驟

方案 A(最簡單,開發/測試適用): 將對應平台的動態庫複製到 JDK 安裝目錄的 bin 目錄下(如 C:\Program Files\Java\jdk1.8.0_XXX\bin\)。

  • Windows 64 位 JDK → 複製 sigar-amd64-winnt.dll(或舊版中的 sigar-x86-winnt.dll,視 Sigar 版本而定)。
  • 原理:java.library.path 默認包含 JDK bin 目錄。

方案 B(生產/容器化推薦): 啟動參數指定 -Djava.library.path=/path/to/native/lib。

java -Djava.library.path=/opt/sigar/lib -cp app.jar:lib/sigar.jar:lib/log4j.jar com.example.Main
  • Dockerfile 中:ENV JAVA_OPTS="-Djava.library.path=/usr/local/sigar/lib"。
  • 將對應 .so/.dll 放入映像的 /usr/local/sigar/lib。

方案 C(Web 容器/應用服務器): 將動態庫放入容器的共享庫路徑(如 Tomcat 的 bin 目錄、或系統 /usr/lib),並確保運行用戶有讀取/執行權限。

驗證代碼

import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.CpuPerc;

public class SigarTest {
    public static void main(String[] args) throws Exception {
        Sigar sigar = new Sigar();
        CpuPerc cpu = sigar.getCpuPerc();
        System.out.println("CPU 用戶態: " + cpu.getUser());
        System.out.println("CPU 系統態: " + cpu.getSys());
        System.out.println("CPU 空閒: " + cpu.getIdle());
        // 更多指標參考 Sigar API 文檔
    }
}

常見坑點避雷

坑點現象解決
32/64 位不匹配UnsatisfiedLinkError: Can't load IA 32-bit .dll on a AMD 64-bit platformJDK 與動態庫位數必須一致:64 位 JDK 用 amd64 庫,32 位 JDK 用 x86 庫
多版本衝突類路徑有多個 sigar.jar清理依賴,保留單一版本
Linux 缺少依賴庫載入 .so 失敗,提示缺少 libc 等安裝 glibc、libstdc++ 等基礎庫;Alpine Linux 需安裝 libc6-compat
權限不足無法讀取 /proc 或動態庫確保運行用戶有權限;容器需以 root 或特權運行

替代方案:oshi (純 Java,無原生庫)

若不想處理 JNI 載入問題,推薦 oshi:

  • 純 Java 實現,零原生依賴,跨平台零配置。
  • Maven: <dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>6.4.0</version></dependency>
  • API 相似:SystemInfo si = new SystemInfo(); CentralProcessor cpu = si.getHardware().getProcessor();

總結

Sigar 功能強大但受限於 JNI 載入機制。開發期直接把 dll/so 扔進 JDK bin 目錄最省事;生產期務必用 -Djava.library.path 顯式指定路徑。若追求零運維成本,oshi 是更現代的選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved