java基礎之垃圾收集器
阿新 • • 發佈:2018-12-19
文章目錄
概述
上一篇主要說了GC的過程,這裡總結一下java的幾種收集器和演算法
前置結論
- 儘可能將物件分配到新生代,因為full GC成本高於minor GC
- 儘量少使用大物件
- JIT編譯引數
- 發生oom時執行指令碼 -XX:OnoomError=D:\reset.bat
- 獲取GC日誌 -Xloggc:D:\gclog.txt
- tomcat catalina.bat引數調優
演算法
標記-清除
首先標記出所有需要回收的物件,標記完成以後統一進行回收。 標記過程參照上一篇不可達物件部分,其缺點有2個
- 效率問題,標記、清除過程效率都不高
- 空間碎片問題,當有較大物件的時候,不得不觸發一次GC
複製演算法
- 雖然這種演算法實現簡單,執行高效,但是代價太高。只能使用一半的空間。但是這種演算法也帶來一種思路,新生代中的物件 消失的很快,不需要按照1:1來分配,HotSpot預設Eden和Survivor1、Survivor2是8:1:1,當回收時,將Eden和Survivor(其中一個)一起復制到另外一塊沒有使用的Survivor中, 也就等於新生代有90%可以利用。
- 如果另一塊Survivor沒有足夠的記憶體來接收上一次存活的物件,這些物件通過分配擔保機制直接進入老年代。
- 複製演算法比較適用於新生代。因為複製演算法在存活物件比較多的時候,效率會降低,所以老年代不適用。
標記-整理演算法
- 針對老年代的特點,與標記-清除演算法的標記過程一樣,但是之後是讓所有存活的物件向另一端移動,然後直接清理掉邊界以外的物件
- 既避免了記憶體碎片,也不需要兩塊相同的空間,價效比較高
分代收集演算法
當前商業虛擬機器都採用該演算法,根據物件存活時期的不同,將記憶體分為幾塊,一般是分為新生代和老年代,在根據不同年代的不同特性來選擇最適合的收集演算法
- 新生代 複製演算法
- 老年代 標記-整理演算法 綜上所述,收集器可以做以下分類
- 按照執行緒來分,序列收集器和並行收集器
- 按工作模式來分,併發式和獨佔式
- 按碎片處理方式,壓縮式和非壓縮式
- 按工作記憶體,新生代和老年代