Java GC 工作原理詳解
JVM 內存結構

- 堆:所有
new 對象分配地,可用 -Xmx/-Xms 控制。劃分為新生代(Eden + From/To Survivor)與老年代。

- 棧:線程私有,每方法調用創建棧幀,存局部變量、操作棧。
- 本地方法棧:支援 Native 方法。
- 方法區:存類信息、靜態變量、常量。用永久代實現,
-XX:PermSize/MaxPermSize 配置。
新生代 GC(Minor GC)
對象朝生夕死,採用複製算法。Eden 滿觸發 GC,存活對象複製到 Survivor,經歷多次仍存活則進老年代。
空閒指針控制分配,連續分配可觀察對象從 Eden → Survivor → 老年代。

三種執行機制:
- Serial GC:單線程,Client 默認,
-XX:+UseSerialGC。
- Parallel Scavenge:多線程,Server 默認,關注吞吐量,
-XX:+UseParallelGC -XX:ParallelGCThreads=4。
- ParNew:多線程,需與 CMS 配合。
老年代 GC(Major/Full GC)
對象存活率高,採用標記算法(標記-清除/標記-整理)。三種收集器:
- Serial MSC:單線程 STW。
- Parallel MSC:多線程並行。
- CMS:並發標記清除,低停頓,四階段(初始標記、並發標記、重新標記、並發清除),不做壓縮以免移動對象導致應用線程找不到引用。
收集器組合對照表
