Java 虛擬機在執行程序時將管理的內存劃分為若干個數據區域,每個區域有特定用途、創建/銷毀時間。線程私有區域隨線程啟動/結束,線程共享區域隨虛擬機啟動/關閉。
| 區域 | 線程性 | 核心功能 | OOM 風險 | 參數控制 |
|---|---|---|---|---|
| 程序計數器 | 私有 | 當前線程執行字節碼行號指示器、分支/循環/跳轉基礎 | 無(規定唯一不 OOM 區域) | 無 |
| 虛擬機棧 | 私有 | Java 方法執行內存模型:棧幀(局部變量表/操作數棧/動態連接/返回地址) | StackOverflowError (深度遞歸)OutOfMemoryError (擴展失敗) | -Xss (棧大小) |
| 本地方法棧 | 私有 | Native 方法服務 | 同虛擬機棧 | 通常合併配置 |
| Java 堆 | 共享 | 對象實例、數組分配區域,GC 主戰場 | 高發:java.lang.OutOfMemoryError: Java heap space | -Xms -Xmx |
| 方法區 | 共享 | 類信息、常量、靜態變量、即時編譯代碼緩存 | OutOfMemoryError: Metaspace (JDK 8+) | -XX:MetaspaceSize -XX:MaxMetaspaceSize |
| 運行時常量池 | 共享 | 方法區一部分:字面量、符號引用、動態添加 | 屬方法區 | 屬方法區 |
| 直接內存 | 共享 | NIO DirectBuffer 分配的堆外內存 | OutOfMemoryError: Direct buffer memory | -XX:MaxDirectMemorySize |
reference(棧上引用)→ 堆中對象實例數據 + 方法區類型數據。兩種主流方式:
棧 reference → 堆句柄池 → [實例數據指針, 類型數據指針] → 實際對象 / 方法區類信息

棧 reference → 直接指向堆中對象實例數據 → 對象頭包含類型指針 → 方法區類信息

[對象頭 Header] [實例數據 Instance Data] [對齊填充 Padding]
| 異常信息 | 原因 | 排查工具/命令 | 解決方向 |
|---|---|---|---|
| Java heap space | 堆內存不足:對象過多/大、洩漏、堆太小 | jmap -histo:live pid MAT 分析 heap dump JVisualVM | 優化代碼/集合大小、檢查洩漏、增大 -Xmx |
| Metaspace | 類元數據區不足:動態生成大量類、類加載器洩漏 | jcmd pid VM.metaspace jstat -gcmetacapacity pid | 增大 MaxMetaspaceSize、檢查動態代理/CGLIB/ScriptEngine 洩漏 |
| StackOverflowError | 棧幀過深:遞歸無終止、循環調用 | jstack pid 分析棧軌跡 | 改遞歸為迭代、增加 -Xss、修正邏輯 |
| Direct buffer memory | 堆外內存不足:NIO 大量 DirectBuffer 未釋放 | jcmd pid VM.native_memory summary | 顯式調用 Cleaner.clean()、增大 MaxDirectMemorySize、用堆內緩衝 |
| GC overhead limit exceeded | GC 佔用 >98% CPU 但回收 <2% 堆 | 同 heap space | 同 heap space、或關閉 -XX:-UseGCOverheadLimit(治標) |
# 1. 查看進程
jps -l
# 2. 堆內存快照
jmap -dump:live,format=b,file=heap.hprof
# 分析用 MAT (Memory Analyzer Tool) 打開 .hprof
# 3. 實時統計
jstat -gcutil 1000 10 # 每秒輸出一次,共10次
# 4. 線程快照
jstack > thread_dump.txt
# 分析死鎖、CPU 高佔用線程
# 5. 類加載統計
jstat -class
# 6. 原生內存追蹤 (需啟動參數 -XX:NativeMemoryTracking=detail)
jcmd VM.native_memory summary
核心心法:理解內存區域劃分是排查 OOM 基石。堆是對象之家,棧是執行之基,方法區是類之倉,直接內存是 NIO 之野。OOM 本質是「申請內存失敗」,定位是哪個區域、哪類對象、哪行代碼、為什麼不釋放。工具鏈:jstat 監控 → jmap 導出 → MAT 分析 → 代碼定位 → 優化驗證。