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

Java 監控系統進程的兩種方案:Runtime.exec 與 JNI 實戰

     編輯:Java 程式設計入門

場景與需求

在同一台 Windows x86 機器上,啟動一個「監控 JVM」去監測另一個「被測 JVM」的記憶體與 CPU 使用率,以對比不同程式在同一虛擬機環境下的資源消耗差異。

方案一:Runtime.exec + 系統命令(輕量級)

利用 java.lang.Runtime.getRuntime().exec() 啟動被測程式並定期抓取進程資訊。

關鍵步驟

  1. 啟動被測 JVM:
    String[] cmd = {"path/to/second/jre/bin/java", "-jar", "target-app.jar"};
    Process p = Runtime.getRuntime().exec(cmd);
  2. 定期採樣進程資訊:
    // 將 tasklist 輸出導向檔案
    Runtime.getRuntime().exec("cmd /c tasklist > log.txt");
    解析 log.txt 獲取目標 PID 的 Memory Usage、CPU Time 等欄位。

優缺點

  • ✅ 實現簡單,無需原生代碼編譯
  • ✅ 跨平台潛力(換命令即可)
  • ❌ 解析文本輸出脆弱,格式隨 OS 版本變化
  • ❌ 採樣頻率受限於進程啟動開銷,難以做高頻監控

方案二:JNI 封裝原生 API(高性能)

編寫 C/C++ 動態庫,調用 Windows GetProcessTimes() 等 API,再經由 JNI 暴露給 Java。

架構圖示

JNI 監控架構

核心流程

  1. Java 端聲明 native long getProcessCPUTime();
  2. 用 javah 生成 C Header
  3. C 端實現:GetProcessTimes() 累加 kernel + user time,換算為毫秒
  4. 編譯為 silib.dll,Java 端 System.loadLibrary("silib") 載入
  5. 構建 CPUUsageSnapshot 類,兩次採樣相減計算佔用率

優缺點

  • ✅ 精度高、開銷低、可做毫秒級採樣
  • ✅ 可獲取純進程級 CPU 時間,不受其他進程干擾
  • ❌ 需編譯平台專屬動態庫,部署較繁瑣
  • ❌ JNI 呼叫本身有微小開銷,若被測程式也大量用 JNI 會相互影響

選型建議

場景推薦方案
快速原型、低頻採樣、跨平台需求方案一
生產環境長期監控、高精度、性能敏感方案二
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved