天天看點

java垃圾回收的一些簡單知識第一章  垃圾回收算法               第二章  垃圾收集器       

第一章  垃圾回收算法

1.1 标記-清除(Mark-Sweep)算法

概述:最基礎的垃圾收集算法,後續的垃圾收集算法都是改進此算法的結果。

過程:先标記,後清除。

不足:(1)效率問題,标記和清除兩個階段的效率都不高;(2)空間問題,标記清除後會産生大量的空間碎片,配置設定大對象的時候會因為空間限制而不得不提前觸發一次垃圾收集動作。

1.2  複制算法

概述:解決了标記清除算法的效率問題,多用在商業虛拟機的新生代,老年代基本不用。

過程:将記憶體劃分為大小相等的兩塊,當一塊用完的時候就将還存活的對象複制到另一塊,然後将已經使用過的空間一次性全部清理掉。

優點:每次隻回收整個半區,實作簡單,運作高效,不需要考慮記憶體碎片等問題。

不足:記憶體縮小為原來的一半。

1.3  标記-整理(Mark-Compact)算法

概述:多用在對象存活率較高的區域,多用在老年代。

過程:類似于标記-清除算法,但是後續步驟不是直接回收,而是讓存活的對象都向一端移動,直接清理掉端邊界以外的記憶體。

優點:解決複制算法的缺點,避免對象存活率較高時的多次回收。

1.4  分代收集(Generational Collection)算法

概述:根據對象的存活周期不同将記憶體劃分為幾塊,java堆一般劃分為新生代和老年代,新生代中的對象存活率較低,适合用複制算法;老年代中的對象存活率較高,而且沒有額外的空間對它進行擔保,必須使用标記-清除算法或者标記-整理算法。

               第二章  垃圾收集器       

2.1  概述

如果說收集算法是記憶體回收的方法論,那麼垃圾收集器就是記憶體回收的具體實作。到目前為止還沒有最好的垃圾收集器出現,我們隻能根據具體應用場景選擇最合适的垃圾收集器。

如果兩個垃圾收集器之間存在連線,就說明它們可以配合使用。

java垃圾回收的一些簡單知識第一章  垃圾回收算法               第二章  垃圾收集器       

2.2  幾種垃圾收集器

2.2.1  Serial收集器

概述:Serial收集器是最基本的,發展曆史最悠久的收集器。單線程,必須“Stop-The World”。Serial主要運作在新生代,采用複制算法,Serial Old主要運作在老年代,采用标記-整理算法。

優點:對于限定單個CPU的環境來說,Serial收集器沒有線程互動的開銷,簡單高效。

不足:收集線程運作時必須暫停使用者線程,使用者體驗不好。

2.2.3  ParNew收集器

概述:ParNew收集器是Serial收集器的多線程版。新生代多線程複制算法,老年代單線程标記-整理算法,-XX:ParallelCCThreads參數用于控制線程數量,預設與CPU核心數相同。

優點:多線程,可以和CMS配合。

缺點:單CPU環境下效果絕不比Serial好。

2.2.4  ParallelScavenge收集器

概述:采用複制算法的新生代多線程收集器,專注于精确控制吞吐量。-XX:MaxGCMillis用于控制最大垃圾收集停頓時間,是大于0的毫秒數;-XX:GCTimeRatio參數用于控制吞吐量,是大于0小于100的整數,吞吐量= 1 - (1 / (1 + x))(x為參數值,預設99)。

優點:停頓時間短,吞吐量可控,可通過-XX:UseAdaptiveSizePolicy參數來開啟GC自适應調解政策。

缺點:在ParallelOld沒出來之前隻能和Serial Old配合使用,可選擇的組合少。

2.2.5  Serial Old收集器

概述:Serial收集器的老年代版本,采用标記-整理算法。

優點:給Client模式下的虛拟機使用,jdk1.5及之前版本可與Parallel Scavenge配合使用(效果不好,拖累Parallel Scavenge的吞吐量),或者作為CMS發生Concurrent Mode Failure時的後備方案。

2.2.6  Parallel Old收集器

概述:ParallelScavenge收集器的老年版,用于與Parallel Scavenge配合提高吞吐量。

優點:可與ParallelScavenge配合,在注重吞吐量和CPU敏感的場合使用。

2.2.7  CMS(Concurrent MarkSweep)收集器

概述:以擷取最短回收停頓時間為目标的收集器,主要應用于網際網路站和B/S伺服器端。

運作過程:initial mark—>concurrent mark—>remark—>concurrent sweep。

        Initial mark:STW,單線程;

        Concurrent mark:可并發,單線程;

        Remark:STW,多線程;

        Concurrent sweep:可并發,單線程。

優點:系統停頓時間短,接近于并行執行,使用者體驗好。

不足:

    (1)對CPU資源敏感:CPU核數越多性能越好,預設線程數為(CPU數+3)/4,4個CPU是分水嶺。

    (2)無法處理浮動垃圾:浮動垃圾是名額記過程之後出現的垃圾。可能出現“Concurrent Mode Failure”,導緻采用Serial Old的後備方案啟動,停頓時間長。

    (3)由于采用标記-清除算法,會産生大量的碎片空間。

2.2.8  G1收集器

概述:G1是一款面向服務端應用的垃圾收集器,有希望替換掉CMS。

運作原理:化整為零,建立region的優先清單,優先回收價值最大的region(展現Garbage-First)。

運作過程:initial marking—>Concurrentmarking—>final marking—>Live data counting and evacuation。

        Initial marking:STW,單線程;

        Concurrent marking:可并發,單線程;

        Final marking:STW,多線程;

        Live data counting and evacuation:STW,多線程。

優點:

    (1)并行與并發;

    (2)空間整合:G1從總體上看是基于标記-整理算法,從局部(兩個region之間)來看是基于複制算法,沒有空間碎片,記憶體規整;

    (3)可預測的停頓:能夠讓使用者明确指定在M毫秒内,消耗在垃圾收集上的時間不得超過N毫秒。

不足:未經實踐檢驗,存在不确定性。

态度:如果你現在采用的垃圾收集器沒有出現問題,那就沒有任何理由現在去選擇G1,如果你的應用追求低停頓,可以嘗試G1,如果你的應用追求吞吐量,那麼G1不會為你帶來什麼好處。