????????JVM提供垃圾回收機制,其也是JVM的核心機制,其主要是實現自動回收不再被引用的對象所占用的內存;對內存進行整理,防止內存碎片化;以及對內存分配配進行管理。
????????JVM 通過兩種主要算法判斷對象是否可回收:
????????????????引用計數算法:為每個對象維護一個引用計數器,每被一個對象調用,則計數加1,當計數為 0 時,也就是沒有被對象調用的時候,即表示該對象可被回收。然而,這個算法無法解決循環引用問題,即a調用b,b調用a的情況,因此已被主流 JVM 棄用。
????????????????可達性分析算法:從 GCRoots 開始,通過引用鏈判斷對象是否可達。不可達的對象被視為垃圾。GC Roots 包括虛擬機棧中的局部變量、類的靜態字段、本地方法棧中的 JNI 引用等,企業是目前主流JVM所使用的算法。
????????
JVM的垃圾回收機制根據內存區域的不同采用不同的回收策略:
????????堆內存回收:主要針對新生代和老年代采用分代收集算法。新生代使用復制算法,將內存分為Eden區和兩個Survivor區,對象首先在Eden區分配,經歷Minor GC后存活對象被復制到Survivor區。老年代采用標記-清除或標記-整理算法處理長期存活的對象。
????????方法區回收:主要回收廢棄的常量和不再使用的類。由于回收條件苛刻且收益較低,通常不頻繁執行。需要滿足類的所有實例已被回收、類加載器已被回收、類的Class對象沒有被引用三個條件才會被回收。
????????JVM提供多種垃圾收集器以適應不同場景:
????????????????串行收集器:單線程執行垃圾回收,適用于客戶端模式和小內存應用,回收時會產生停頓。
????????????????并行收集器:多線程并行回收,適合吞吐量優先的應用場景,能有效利用多核CPU資源。
????????????????并發標記清除收集器:在應用線程運行同時進行大部分回收工作,顯著減少停頓時間,適合響應時間敏感的應用。
????????JVM還提供內存分配和調優相關機制:
????????????????對象優先在Eden區分配,大對象直接進入老年代,長期存活的對象通過年齡閾值晉升到老年代。
????????????????通過調節新生代與老年代比例、設置停頓時間目標、調整垃圾回收線程數等參數可優化GC性能。
????????????????使用內存逃逸分析和棧上分配等技術減少堆內存壓力,某些情況下對象可直接在棧上分配和回收。
????????