一、GC的作用與原理
?核心功能?
自動識別并回收堆內存中不再被引用的對象,釋放內存空間。
避免手動管理內存的復雜性(如C/C++中的delete/free操作),降低內存泄漏風險。
?判斷對象可回收的方法?
?可達性分析算法:從GC Roots(如虛擬機棧、靜態變量、本地方法棧等)出發,遍歷對象引用鏈,無法到達的對象標記為可回收。
替代了傳統的引用計數法(易循環引用導致內存泄漏)。
二、分代管理與GC類型
JVM將堆內存劃分為不同代區,針對不同生命周期對象采用差異化回收策略:
?新生代(Young Generation)??
?區域劃分:Eden區(新對象分配地)、Survivor區(S0/S1,存活對象過渡區)。
?Minor GC/Young GC:當Eden區滿時觸發,存活對象復制到Survivor區,多次存活后晉升老年代。
?特點:高頻、快速,采用復制算法?(減少碎片)。
?老年代(Old Generation)??
?Major GC/Old GC:CMS收集器特有,單獨回收老年代(其他收集器通常直接觸發Full GC)。
?Full GC:回收整個堆(含方法區/元空間),觸發條件包括:
老年代空間不足。
方法區(永久代)內存不足(JDK8前)。
System.gc()顯式調用(可通過參數禁用)。
三、常見垃圾收集器
JVM提供多種收集器,適應不同場景需求:
?新生代收集器?
?Serial:單線程,適合客戶端應用(低資源消耗)。
?ParNew:多線程版Serial,配合CMS使用。
?Parallel Scavenge:吞吐量優先,適合后臺計算任務。
?老年代收集器?
?CMS(Concurrent Mark Sweep)?:并發標記清除,減少停頓時間,但易碎片化。
?G1(Garbage-First)?:分區回收,兼顧吞吐與低延遲,適合大堆內存。
?全堆收集器?
?ZGC/Shenandoah:超低延遲(毫秒級停頓),適用于實時系統。
四、GC調優策略
?目標選擇?
?吞吐量優先:如Parallel Scavenge + Parallel Old,適合批處理任務。
?低延遲優先:如G1/CMS,適合Web服務。
?關鍵參數調整?
新生代與老年代比例(-XX:NewRatio)。
Survivor區比例(-XX:SurvivorRatio)。
堆大小(-Xms初始堆、-Xmx最大堆)。
?監控工具?
jstat查看GC頻率與耗時。
VisualVM分析堆內存分布。
五、GC算法對比
?標記-清除:簡單但碎片化嚴重。
?復制:高效無碎片,但內存利用率低(適合新生代)。
?標記-整理:解決碎片問題,適合老年代(如Serial Old)。
?分代收集:綜合不同算法,適應對象生命周期差異。