堆核心特性
- 線程共享:JVM 啟動時創建,所有線程共用。
- 對象實例主戰場:幾乎所有
new 對象、陣列在這裡分配。
- GC 管理核心區:垃圾收集器主要掃描回收區域。
- 容量可配置:
-Xms 初始/最小、-Xmx 最大,支援動態擴縮。
- 邏輯連續即可:物理內存可不連續。
- OOM 條件:分配需求 > 最大可用(含擴展後仍不足)拋
OutOfMemoryError。
分代收集佈局(主流 HotSpot)
Java Heap
├── Young Generation (新生代)
│ ├── Eden Space (伊甸區)
│ ├── Survivor 0 (From)
│ └── Survivor 1 (To)
├── Old Generation (老年代)
└── Metaspace / PermGen (元空間/永久代) — 類元數據,非堆但常歸屬討論
新生代特點
- 對象誕生於 Eden,Minor GC 後存活者進 Survivor 區輪換。
- 年齡計數器達閾值(默認 15)晉升老年代。
- 默認
Eden : S0 : S1 = 8 : 1 : 1(-XX:SurvivorRatio)。
老年代特點
- 存放長期存活、大對象、動態年齡判定晉升對象。
- Major GC / Full GC 觸發,頻率低、耗時長。
常見調優參數
| 參數 | 含義 |
-Xms | 初始/最小堆大小 |
-Xmx | 最大堆大小 |
-Xmn | 新生代大小 |
-XX:SurvivorRatio | Eden/Survivor 比例 |
-XX:PretenureSizeThreshold | 大對象直接進老年代閾值 |
-XX:MaxTenuringThreshold | 晉升老年代年齡閾值 |
記憶體洩漏 vs 溢出
- 洩漏:對象不可達但 GC 未回收(靜態集合持有、未關閉資源、ThreadLocal 洩漏)。
- 溢出:活對象總量超過
-Xmx(堆太小、大對象分配、類加載過多導致元空間 OOM)。