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

輕量級 JVM 堆內存監控:善用 Runtime API 替代重型工具

     編輯:Java 相關知識

面對記憶體溢出問題,開發者往往直奔 JProfiler、VisualVM 等重型分析工具。實際上,JDK 內建的 java.lang.Runtime 類即提供核心堆內存指標,零依賴、零侵入,適合快速診斷與輕量級監控嵌入。

核心 API 對照表

方法含義典型用途
totalMemory()JVM 當前向作業系統申請的堆總量(含已用+空閒)監控堆擴張趨勢
freeMemory()當前堆中空閒字節數計算實際使用量
maxMemory()JVM 最大可用堆上限(對應 -Xmx)預警臨界閾值

已用內存 = totalMemory() - freeMemory()

實戰驗證代碼

public static void main(String[] args) throws Exception {
    final int MB = 1024 * 1024;
    Runtime rt = Runtime.getRuntime();
    
    System.out.println("##### Heap utilization statistics [MB] #####");
    List holder = new ArrayList<>();
    
    for (int i = 0; i < 5000; i++) {
        Thread.sleep(1000);
        // 持續分配大對象模擬內存增長
        for (int j = 0; j < 5000; j++) {
            holder.add(new String[1000]);
        }
        long used = (rt.totalMemory() - rt.freeMemory()) / MB;
        System.out.println("Used Memory: " + used + "M");
    }
    
    System.out.println("Free Memory:  " + rt.freeMemory() / MB + "M");
    System.out.println("Total Memory: " + rt.totalMemory() / MB + "M");
    System.out.println("Max Memory:   " + rt.maxMemory() / MB + "M");
}

執行結果分析(-Xms64m -Xmx256m)

##### Heap utilization statistics [MB] #####
Used Memory: 19M
Used Memory: 38M
...
Used Memory: 249M
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

觀察可見:

  • 堆從初始 64M 逐步擴張至 256M 上限
  • totalMemory() 隨分配壓力自動增長
  • 觸及 maxMemory() 後拋出 OOM

進階應用建議

  1. 嵌入式健康檢查端點:在 Spring Boot Actuator 或自定義 Servlet 中暴露 `/health/memory`,定期上報至監控系統
  2. 閾值告警:當 used / max > 0.85 觸發日誌告警或自動 Dump
  3. 趨勢分析:定時採樣寫入時序資料庫(InfluxDB/Prometheus),繪製堆增長曲線

局限性說明

Runtime 僅提供堆級聚合視圖,無法細分至對象類型、GC 代、線程局部分配緩衝(TLAB)等維度。深度洩漏分析仍需 MAT、JFR 或商業 APM 工具。但作為「第一響應」與「輕量嵌入」,它極具性價比。

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