垃圾收集器組合
JDK7/8后,HotSpot虛擬機所有收集器及組合(連線),如下圖:
圖中展示了7種不同分代的收集器:
Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;而它們所處區(qū)域,則表明其是屬于新生代收集器還是老年代收集器:
新生代收集器:Serial、ParNew、Parallel Scavenge;
老年代收集器:Serial Old、Parallel Old、CMS;
整堆收集器:G1;兩個收集器間有連線,表明它們可以搭配使用
其中Serial Old作為CMS出現(xiàn)"Concurrent Mode Failure"失敗的后備預案
G1收集器
G1(Garbage-First)是JDK7-u4才推出商用的收集器;
1、特點
(1)并行與并發(fā)
能充分利用多CPU、多核環(huán)境下的硬件優(yōu)勢;
可以并行來縮短"Stop The World"停頓時間;
也可以并發(fā)讓垃圾收集與用戶程序同時進行;
(2)分代收集,收集范圍包括新生代和老年代
能獨立管理整個GC堆(新生代和老年代),而不需要與其他收集器搭配;
能夠采用不同方式處理不同時期的對象;
雖然保留分代概念,但Java堆的內(nèi)存布局有很大差別:將整個堆劃分為多個大小相等的獨立區(qū)域(Region),新生代和老年代不再是物理隔離,它們都是一部分Region(不需要連續(xù))的集合;
(3)結(jié)合多種垃圾收集算法,空間整合,不產(chǎn)生碎片
從整體看,是基于標記-整理算法;
從局部(兩個Region間)看,是基于復制算法;
基本不會產(chǎn)生內(nèi)存碎片,有利于長時間運行;
(4)可預測的停頓:低停頓的同時實現(xiàn)高吞吐量
G1除了追求低停頓處,還能建立可預測的停頓時間模型;
可以明確指定M毫秒時間片內(nèi),垃圾收集消耗的時間不超過N毫秒;
2、應用場景
面向服務端應用,針對具有大內(nèi)存、多處理器的機器;
最主要的應用是為需要低GC延遲,并具有大堆的應用程序提供解決方案;
如:在堆大小約6GB或更大時,可預測的暫停時間可以低于0.5秒;
3、設置參數(shù)
"-XX:+UseG1GC":指定使用G1收集器;
"-XX:InitiatingHeapOccupancyPercent":當整個Java堆的占用率達到參數(shù)值時,開始并發(fā)標記階段;默認為45;
"-XX:MaxGCPauseMillis":為G1設置暫停時間目標,默認值為200毫秒;
"-XX:G1HeapRegionSize":設置每個Region大小,范圍1MB到32MB;目標是在最小Java堆時可以擁有約2048個Region;
4、為什么G1收集器可以實現(xiàn)可預測的停頓
可以有計劃地避免在Java堆的進行全區(qū)域的垃圾收集;
G1跟蹤各個Region獲得其收集價值大小,在后臺維護一個優(yōu)先列表;
每次根據(jù)允許的收集時間,優(yōu)先回收價值最大的Region(名稱Garbage-First的由來);
這就保證了在有限的時間內(nèi)可以獲取盡可能高的收集效率;
5、G1收集器運作過程
(A)、初始標記(Initial Marking)
僅標記一下GC Roots能直接關(guān)聯(lián)到的對象;
且修改TAMS(Next Top at Mark Start),讓下一階段并發(fā)運行時,用戶程序能在正確可用的Region中創(chuàng)建新對象;
需要"Stop The World",但速度很快;
(B)、并發(fā)標記(Concurrent Marking)
進行GC Roots Tracing的過程;
剛才產(chǎn)生的集合中標記出存活對象;
耗時較長,但應用程序也在運行;
并不能保證可以標記出所有的存活對象;
(C)、最終標記(Final Marking)
為了修正并發(fā)標記期間因用戶程序繼續(xù)運作而導致標記變動的那一部分對象的標記記錄;
上一階段對象的變化記錄在線程的Remembered Set Log;
這里把Remembered Set Log合并到Remembered Set中;
需要"Stop The World",且停頓時間比初始標記稍長,但遠比并發(fā)標記短;
采用多線程并行執(zhí)行來提升效率;
(D)、篩選回收(Live Data Counting and Evacuation)
首先排序各個Region的回收價值和成本;
然后根據(jù)用戶期望的GC停頓時間來制定回收計劃;
最后按計劃回收一些價值高的Region中垃圾對象;
回收時采用"復制"算法,從一個或多個Region復制存活對象到堆上的另一個空的Region,并且在此過程中壓縮和釋放內(nèi)存;
可以并發(fā)進行,降低停頓時間,并增加吞吐量;