Java 虛擬機規範將運行時內存劃分為若干區域,各司其職。理解內存模型是排查 OOM、優化 GC、調優性能的基石。本文系統講解五大運行時區域、對象創建與訪問定位兩大主流方式,並配合圖解深度剖析。

線程私有:程序計數器、虛擬機棧、本地方法棧
線程共享:Java 堆、方法區
UndefinedreturnAddress;long/double 佔 2 SlotStackOverflowError:棧深度超限(遞歸過深、循環調用)OutOfMemoryError:動態擴展無法申請足夠內存native 方法(C/C++ 實現)StackOverflowError/OOM-Xms/-Xmx、-Xmn、-XX:SurvivorRatioOOM:堆耗盡且無法擴展OOM:無法滿足內存分配需求String.intern())OOM:常量過多導致方法區耗盡代碼 Object obj = new Object(); 在內存中:
reference 類型變量 obj
reference 存句柄地址 → 句柄包含實例數據指針 + 類型數據指針reference 不變
reference 直接存對象地址| OOM 類型 | 典型原因 | 排查工具/參數 | 解決方向 |
|---|---|---|---|
| Java Heap Space | -XX:+HeapDumpOnOutOfMemoryErrorMAT/Eclipse Memory Analyzer JVisualVM |
修復泄漏、調大 -Xmx、優化對象生命週期 |
|
| Metaspace / PermGen | 類加載過多(動態代理、JSP、OSGi、熱部署) | -XX:MaxMetaspaceSizejcmd PID VM.classes |
限制元空間、檢查類加載器洩漏、減少動態生成類 |
| StackOverflowError | 遞歸無終止條件、循環調用 | -Xss 調大棧容量檢查棧追蹤 |
修正遞歸邏輯、改迭代、優化調用鏈 |
| Direct Buffer Memory | NIO 直接內存未釋放、Netty/文件映射過多 | -XX:MaxDirectMemorySizeJMX 監控 |
顯式釋放、調大直接內存、使用堆內緩存 |
| GC Overhead Limit Exceeded | 堆極小、對象存活率高、GC 頻繁且回收少 | GC 日誌分析 G1/ZGC 調優 |
調大堆、優化對象分配率、升級 GC 算法 |
掌握 JVM 內存區域,是從「會用 Java」邁向「懂 JVM」的關鍵門檻。