許多開發者將 Java 內存簡化為「堆」與「棧」,實則 JVM 規範定義了多個職責明確的運行時數據區。本文依據《深入理解 Java 虛擬機》與 JVM 規範,系統梳理各區域功能、異常與調優要點。
long/double 佔 2 Slot,其餘 1 Slot。編譯期確定大小,運行期不變。StackOverflowError(棧深度超限)、OutOfMemoryError(動態擴展失敗)。-Xms 初始、-Xmx 最大、-Xmn 新生代。不可擴展時拋 OOM。-XX:MetaspaceSize、-XX:MaxMetaspaceSize。String.intern() 可運行期放入新常量。受方法區內存限制,滿則 OOM。DirectByteBuffer 通過 Native 分配,避免堆內外拷貝。受 -XX:MaxDirectMemorySize 限制,耗盡拋 OOM。| 區域 | 共享性 | 主要內容 | 典型異常 | 關鍵參數 |
|---|---|---|---|---|
| 程序計數器 | 私有 | 字節碼行號 | 無 | 無 |
| 虛擬機棧 | 私有 | 幀(局部變量/操作數棧/動態鏈接) | SOE/OOM | -Xss |
| 本地方法棧 | 私有 | Native 方法幀 | SOE/OOM | -XX:MaxDirectMemorySize |
| Java 堆 | 共享 | 對象實例/數組 | OOM | -Xms/-Xmx/-Xmn |
| 方法區/元空間 | 共享 | 類/常量/靜態變量/JIT 代碼 | OOM | -XX:MetaspaceSize |
| 運行時常量池 | 共享 | 字面量/符號引用/直接引用 | OOM | 同上 |
| 直接內存 | 共享 | NIO 堆外緩衝 | OOM | -XX:MaxDirectMemorySize |