1. 程式人生 > >java基礎知識之GC

java基礎知識之GC

java基礎知識之GC

1 GC演算法

  • 標記清除
  • 標記整理
  • 複製演算法
  1. 標記清除:
  • 特點
    • 標記出所有需要回收的物件,在標記完成後統一回收所有被標記的物件
    • 在標記完成後統一回收所有被標記的物件
  • 缺點:
    • 效率低,標記和清除兩個過程的效率都不高;
    • 空間碎片化嚴重,標記清除之後會產生大量不連續的記憶體碎片,空間碎片太多可能會導致以後在程式執行過程中需要分配較大物件時,無法找到足夠的連續記憶體而不得不提前觸發另一次垃圾收集動作。
  1. 標記整理
  • 特點
    • 標記
    • 讓所有存活的物件都向一端移動,然後直接清理掉端邊界以外的記憶體
    • 在一般廠商JVM中老年代GC就是使用的這種演算法,由於老年代的特點是每次回收都只回收少量物件。
  1. 複製
    -特點
  • 將可用記憶體按容量劃分為大小相等的兩塊,每次只使用其中的一塊。
  • 當這一塊的記憶體用完了,就將還存活著的物件複製到另外一塊上面,然後再把已使用過的記憶體空間一次清理掉
  • 缺點
    • 記憶體空間的使用做出了高昂的代價,因為能夠使用的記憶體縮減到原來的一半
    • 很顯然,Copying演算法的效率跟存活物件的數目多少有很大的關係,如果存活物件很多,那麼Copying演算法的效率將會大大降低。我們的新生代GC演算法採用的是這種演算法

2 判斷gc的方法

  • 引用計數收集器
    • 引用計數是垃圾收集器中的早期策略。在這種方法中,堆中每個物件(不是引用)都有一個引用計數。當一個物件被建立時,且將該物件分配給一個變數,該變數計數設定為1。當任何其它變數被賦值為這個物件的引用時,計數加1(a = b,則b引用的物件+1),但當一個物件的某個引用超過了生命週期或者被設定為一個新值時,物件的引用計數減1。任何引用計數為0的物件可以被當作垃圾收集。當一個物件被垃圾收集時,它引用的任何物件計數減1。
    • 優點:引用計數收集器可以很快的執行,交織在程式執行中。對程式不被長時間打斷的實時環境比較有利
    • 缺點:無法解決物件之間的迴圈引用的問題
  • 跟蹤收集器
    • 通過一系列成為“GC roots” 的物件作為起始點,從這些起始點開始,向下搜尋,搜尋走過的路徑稱為引用鏈。當一個物件到GC root 沒有任何引用鏈(圖論中的不可達)則證明了物件可被回收。
    • 可作為GC root 的物件
      • java虛擬機器棧(Stack)中的引用物件
      • 方法區中類的靜態屬性引用的物件
      • 方法區中常量引用的物件
      • 本地方法棧中jni引用的物件

3 垃圾回收器

  • Serial收集器
    • 是一個單執行緒(單執行緒不僅僅說明是它會使用一個CPU 或者 一條垃圾收集執行緒去完成收集工作,而是暫停其他工作線即 stop the world)
    • Client 是很好的選擇
    • 複製演算法
  • Serial Old收集器
    • Serial收集器的老年代版本,它同樣是一個單執行緒收集器,使用“標記-整理”演算法。
    • 主要意義也是在於給Client模式下的虛擬機器使用。
  • ParNew收集器
    • Serial收集器的多執行緒版本
    • Server模式下新生代首選,目前只有它能與CMS收集器配合工作
  • Parallel Scavenge收集器
    • 吞吐量優先”收集器
    • 新生代收集器,複製演算法,並行的多執行緒收集器
    • 目標是達到一個可控制的吞吐量(Throughput)吞吐量=執行使用者程式碼時間/(執行使用者程式碼時間+垃圾收集時間),虛擬機器總共運行了100分鐘,其中垃圾收集花掉1分鐘,那吞吐量就是99%。
  • Parallel Old收集器
    • Parallel Scavenge收集器的老年代版本,使用多執行緒和“標記-整理”演算法。
    • 在注重吞吐量以及CPU資源敏感的場合,都可以優先考慮Parallel Scavenge加Parallel Old收集器。
  • CMS收集器
    • 以獲取最短回收停頓時間為目標的收集器。
    • 基於“標記—清除”演算法實現的
    • CMS收集器的記憶體回收過程是與使用者執行緒一起併發執行的
    • 它的運作過程分為4個步驟,包括:
      1. 初始標記,“Stop The World”,只是標記一下GC Roots能直接關聯到的物件,速度很快
      2. 併發標記,併發標記階段就是進行GC RootsTracing的過程
      3. 重新標記,Stop The World”,是為了修正併發標記期間因使用者程式繼續運作而導致標記產生變動的那一部分物件的標記記錄,但遠比並發標記的時間短
      4. 併發清除(CMS concurrent sweep)
    • 優點:併發收集、低停頓
    • 缺點: 對CPU資源非常敏感。無法處理浮動垃圾,可能出現“Concurrent Mode Failure”失敗而導致另一次Full GC的產生。
  • G1(Garbage-First)收集器
    • 優點:
      1. 並行與併發:充分利用多CPU、多核環境下的硬體優勢
      2. 分代收集:不需要其他收集器配合就能獨立管理整個GC堆
      3. 空間整合:“標記—整理”演算法實現的收集器,區域性上基於“複製”演算法不會產生記憶體空間碎片
      4. 可預測的停頓:能讓使用者明確指定在一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒

4 物件的分配

  1. 大多數情況物件在eden區中分配,當eden區中沒有足夠的記憶體空間進行分配時,虛擬機器進行一次minor GC,即在新生代的垃圾回收 速度快於老年代的full GC
  2. 大物件直接進入老年代
  3. 在survivor區中等到maxTeuringThreshold(15)次的進入老年代