Java 設計之初即移除 C/C++ 指標,改用引用 存取物件。引用類型分四級,決定物件生命週期與 GC 回收時機:
| 引用類型 | 強度 | GC 行為 | 典型用途 |
|---|---|---|---|
| 強引用 | 最強 | 絕不回收 (OOM 拋出也不回收) | 一般物件 `Object obj = new Object()` |
| 軟引用 | 次之 | 記憶體不足前回收 | 快取 (`SoftReference`)、圖片緩存 |
| 弱引用 | 弱 | 下次 GC 必回收 | 觀察者模式、`WeakHashMap`、ThreadLocal |
| 虛引用 | 最弱 | 任何時候可回收,需配合 ReferenceQueue | 直接記憶體釋放追蹤、Cleaner 機制 |
| 收集器 | 模式 | 新生代/老年代 | 特點 | 適用場景 |
|---|---|---|---|---|
| Serial | 單執行緒 | 兩者 | 簡單、Client 模式預設 | 單核、小記憶體 |
| Parallel (PS) | 多執行緒 | 兩者 | 高吞吐、Server 模式預設 (Java 8) | 批次處理、科學計算 |
| CMS | 併發 | 老年代 | 低停頓、碎片化、Java 9 棄用、Java 14 移除 | 舊版低延遲需求 |
| G1 | 併發+分區 | 兩者 | 可預測停頓、Region 架構、Java 9+ 預設 | 大堆 (6G+)、微服務 |
| ZGC | 併發+著色指標 | 兩者 | 亞毫秒停頓、TB 級堆、Java 11 實驗/15 正式 | 超大堆、極低延遲 |
| Shenandoah | 併發+轉發指標 | 兩者 | 類 ZGC、Red Hat 主導、Java 12+ | 大堆、低延遲 |
// 典型:靜態集合持續增長
public class LeakExample {
private static final List
`finalize()` 不保證執行、拖慢 GC、Java 9 棄用。資源釋放請用 try-with-resources、`AutoCloseable` 或 `Cleaner` (Java 9+)。
# 基礎堆設定 (生產建議 Xms=Xmx 避免震盪)
-Xms4g -Xmx4g
# 新生代/老年代比例
-XX:NewRatio=2 # 老年代:新生代 = 2:1
-XX:SurvivorRatio=8 # Eden:Survivor = 8:1:1
# 選擇收集器 (三選一)
-XX:+UseG1GC # 通用首選
-XX:+UseZGC -XX:+ZGenerational # JDK 21+ 分代 ZGC,超大堆
-XX:+UseShenandoahGC # 替代方案
# G1 關鍵目標
-XX:MaxGCPauseMillis=200 # 目標停頓時間
-XX:G1HeapRegionSize=16m # Region 大小 (1-32MB,堆大則調大)
# 診斷日誌 (統一格式 JDK 9+)
-Xlog:gc*:file=/logs/gc.log:time,uptime,level,tags:filecount=5,filesize=100m