堆是 JVM 管理的最大記憶體區域,存放物件實例。邏輯劃分:

| 參數 | 說明 | 預設/建議 |
|---|---|---|
-Xms / -Xmx | 堆初始/最大大小 | 生產建議設相同,避免震盪 |
-Xmn | 新生代大小 | 通常為堆 1/3 ~ 1/4 |
-XX:NewRatio=n | 老年代:新生代 比值 | 預設 2 (即新生代佔 1/3) |
-XX:SurvivorRatio=n | Eden:Survivor 比值 | 預設 8 (Eden:S0:S1 = 8:1:1) |
-XX:MaxTenuringThreshold=n | 晋升老年代年齡閾值 | 預設 15 (CMS 為 6) |
-XX:PretenureSizeThreshold | 大物件直接進老年代閾值 | 僅 Serial/ParNew 有效 |
-XX:PermSize / -XX:MaxPermSize | 永久代大小 | JDK 8 廢棄,改用 -XX:MetaspaceSize |
HandlePromotionFailure 決定是否觸發 Full GC。| GC 類型 | 發生區域 | 演算法 | 特點 |
|---|---|---|---|
| Minor GC | 新生代 | 複製 | 頻繁、快、回收率高 (70-95%) |
| Full GC (Major GC) | 老年代/永久代/整堆 | 標記-清除 / 標記-整理 | 耗時長、頻率低、會產生碎片 (標記-清除) |
啟動參數:-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log
[GC [PSYoungGen: 1019K->568K(28672K)] 1019K->568K(92672K), 0.0529244 secs]
[Full GC [PSYoungGen: 568K->0K(28672K)] [ParOldGen: 0K->478K(64000K)] 568K->478K(92672K) [PSPermGen: 2484K->2483K(21504K)], 0.0178331 secs]
解析:
[GC ...]:Minor GC,PSYoungGen 區前後大小、總堆前後大小、耗時。[Full GC ...]:Full GC,含 Young、Old、Perm 三區變化。Heap PSYoungGen total 28672K, used 1505K ... eden space 25088K, 6% used ...輸出顯示:新生代 total 18432K (≈18M) = Eden 16384K + 1 Survivor 2048K(另一 Survivor 空閒),老年代 40960K (≈40M),堆總 60M,符合預期。
-Xnoclassgc 可關閉類別回收。# 收集器選擇
-XX:+UseSerialGC # 串行
-XX:+UseParallelGC # 並行 (吞吐優先)
-XX:+UseConcMarkSweepGC # CMS 低延遲
-XX:+UseG1GC # G1 區域化 (JDK 9+ 預設)
# 並行調優
-XX:ParallelGCThreads=n
-XX:MaxGCPauseMillis=n
-XX:GCTimeRatio=n
# 診斷
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/to/dump.hprof
-Xloggc:/path/to/gc.log