
Java的垃圾回收器(Garbage Collector,簡稱GC)是JVM中自動管理內(nèi)存的核心機制。它負責回收不再使用的對象所占用的內(nèi)存空間,從而避免內(nèi)存泄漏和手動釋放內(nèi)存帶來的風險。不同的垃圾回收器適用于不同的應(yīng)用場景,選擇合適的GC對程序性能至關(guān)重要。

常見的垃圾回收器分類及特點
目前主流的JVM(如HotSpot)提供了多種垃圾回收器,主要分為以下幾類:
1. Serial GC:單線程回收器
-
適用場景:客戶端模式或小型應(yīng)用
-
特點:
- 使用單個線程進行垃圾回收,簡單高效
- 在執(zhí)行GC時會暫停所有用戶線程(Stop-The-World)
- 內(nèi)存占用小,適合運行在單核CPU或內(nèi)存較小的環(huán)境中
-
使用參數(shù):-XX:+UseSerialGC
2. Parallel Scavenge GC:多線程吞吐優(yōu)先回收器
-
適用場景:注重吞吐量的后端服務(wù)
-
特點:
- 多線程并行執(zhí)行GC,提升效率
- 主要關(guān)注“吞吐量”(應(yīng)用程序運行時間 / 總時間)
- 年輕代使用復制算法,老年代使用標記-整理算法
-
使用參數(shù):-XX:+UseParallelGC
3. CMS(Concurrent Mark Sweep)GC:低延遲回收器
-
適用場景:需要響應(yīng)時間較短的應(yīng)用,如Web服務(wù)器
-
特點:
- 以低停頓為目標,適合交互式系統(tǒng)
- 老年代GC過程分為多個階段,部分階段與用戶線程并發(fā)執(zhí)行
- 存在“并發(fā)模式失敗”和“內(nèi)存碎片”問題
-
使用參數(shù):-XX:+UseConcMarkSweepGC(注意:JDK9開始廢棄,JDK14移除)
4. G1(Garbage First)GC:平衡吞吐與延遲的分區(qū)回收器
-
適用場景:堆內(nèi)存較大、希望兼顧吞吐和響應(yīng)時間的系統(tǒng)
-
特點:
- 將堆劃分為多個大小相等的Region
- 可預(yù)測的停頓時間模型,優(yōu)先回收垃圾最多的區(qū)域
- 支持并發(fā)執(zhí)行,減少停頓時間
-
使用參數(shù):-XX:+UseG1GC(JDK7+推薦使用)
5. ZGC 和 Shenandoah:新一代低延遲GC
-
適用場景:超大堆內(nèi)存(TB級)且要求極低延遲的系統(tǒng)
-
特點:
- 幾乎所有階段都可以與用戶線程并發(fā)執(zhí)行
- ZGC支持TB級堆,停頓時間通常小于10ms
- Shenandoah也主打低延遲,適合高并發(fā)場景
-
使用參數(shù):
- ZGC:-XX:+UseZGC
- Shenandoah:第三方JVM或特定版本支持
如何根據(jù)業(yè)務(wù)需求選擇合適的GC?
選擇GC的關(guān)鍵在于理解你的應(yīng)用類型和性能目標。下面是一些實用建議:

關(guān)注點一:吞吐量 vs 響應(yīng)時間
- 如果你運行的是后臺批處理任務(wù),更看重整體吞吐量,可以選擇 Parallel Scavenge GC
- 如果是在線服務(wù)系統(tǒng),例如Web應(yīng)用、API服務(wù),需要快速響應(yīng)請求,建議選擇 G1 GC 或 CMS(已過時)
關(guān)注點二:堆內(nèi)存大小
- 堆內(nèi)存較?。ū热鐜装費B以內(nèi)),Serial GC 是輕量而高效的選擇
- 堆內(nèi)存超過幾十GB,考慮使用 G1 GC
- 若堆達到TB級別,追求更低延遲,可以嘗試 ZGC 或 Shenandoah
關(guān)注點三:GC停頓對業(yè)務(wù)的影響
- 對停頓敏感的系統(tǒng)(如金融交易、實時計算),應(yīng)避免長時間STW(Stop-The-World)
- 這類場景下,G1、ZGC 和 Shenandoah 更合適
實際選型的一些建議
-
默認選擇 G1 GC:從 JDK9 開始,G1 成為默認GC,適應(yīng)大多數(shù)通用場景
-
不要盲目追求低延遲:ZGC 和 Shenandoah 雖然停頓短,但配置復雜,且可能犧牲一些吞吐能力
-
測試驗證最重要:不同GC在實際負載下的表現(xiàn)差異可能很大,建議通過壓力測試觀察GC日志,對比吞吐量、停頓時長等指標
總結(jié)一下
Java中的GC種類多樣,各有側(cè)重。選擇合適的垃圾回收器,關(guān)鍵是看你的應(yīng)用對吞吐、延遲、堆大小的具體要求。如果你不確定該用哪個,先用 G1 GC,然后根據(jù)實際運行情況調(diào)整?;旧暇瓦@些,不復雜但容易忽略細節(jié)的地方還是得靠實測來驗證。
立即學習“Java免費學習筆記(深入)”;
以上就是解釋Java中的垃圾回收器的分類和特點,如何選擇合適的垃圾回收器?的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!