1. 程式人生 > >java基礎之垃圾收集器

java基礎之垃圾收集器

文章目錄

概述

上一篇主要說了GC的過程,這裡總結一下java的幾種收集器和演算法

前置結論

  • 儘可能將物件分配到新生代,因為full GC成本高於minor GC
  • 儘量少使用大物件
  • JIT編譯引數
  • 發生oom時執行指令碼 -XX:OnoomError=D:\reset.bat
  • 獲取GC日誌 -Xloggc:D:\gclog.txt
  • tomcat catalina.bat引數調優

演算法

標記-清除

在這裡插入圖片描述

首先標記出所有需要回收的物件,標記完成以後統一進行回收。 標記過程參照上一篇不可達物件部分,其缺點有2個

  1. 效率問題,標記、清除過程效率都不高
  2. 空間碎片問題,當有較大物件的時候,不得不觸發一次GC
複製演算法

為了解決效率問題,

  • 雖然這種演算法實現簡單,執行高效,但是代價太高。只能使用一半的空間。但是這種演算法也帶來一種思路,新生代中的物件 消失的很快,不需要按照1:1來分配,HotSpot預設Eden和Survivor1、Survivor2是8:1:1,當回收時,將Eden和Survivor(其中一個)一起復制到另外一塊沒有使用的Survivor中, 也就等於新生代有90%可以利用。
  • 如果另一塊Survivor沒有足夠的記憶體來接收上一次存活的物件,這些物件通過分配擔保機制直接進入老年代。
  • 複製演算法比較適用於新生代。因為複製演算法在存活物件比較多的時候,效率會降低,所以老年代不適用。
標記-整理演算法

在這裡插入圖片描述

  • 針對老年代的特點,與標記-清除演算法的標記過程一樣,但是之後是讓所有存活的物件向另一端移動,然後直接清理掉邊界以外的物件
  • 既避免了記憶體碎片,也不需要兩塊相同的空間,價效比較高
分代收集演算法

當前商業虛擬機器都採用該演算法,根據物件存活時期的不同,將記憶體分為幾塊,一般是分為新生代和老年代,在根據不同年代的不同特性來選擇最適合的收集演算法

  • 新生代 複製演算法
  • 老年代 標記-整理演算法 綜上所述,收集器可以做以下分類
  • 按照執行緒來分,序列收集器和並行收集器
  • 按工作模式來分,併發式和獨佔式
  • 按碎片處理方式,壓縮式和非壓縮式
  • 按工作記憶體,新生代和老年代