面對記憶體溢出問題,開發者往往直奔 JProfiler、VisualVM 等重型分析工具。實際上,JDK 內建的 java.lang.Runtime 類即提供核心堆內存指標,零依賴、零侵入,適合快速診斷與輕量級監控嵌入。
| 方法 | 含義 | 典型用途 |
|---|---|---|
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
##### Heap utilization statistics [MB] #####
Used Memory: 19M
Used Memory: 38M
...
Used Memory: 249M
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
觀察可見:
totalMemory() 隨分配壓力自動增長maxMemory() 後拋出 OOMused / max > 0.85 觸發日誌告警或自動 DumpRuntime 僅提供堆級聚合視圖,無法細分至對象類型、GC 代、線程局部分配緩衝(TLAB)等維度。深度洩漏分析仍需 MAT、JFR 或商業 APM 工具。但作為「第一響應」與「輕量嵌入」,它極具性價比。