五、jvm垃圾回收3(几种垃圾收集器)
根據(jù)《深入理解java虛擬機》這本書總結
前面說到了垃圾標記方法、垃圾收集算法、這篇主要總結一下垃圾收集的具體實現(xiàn):垃圾收集器
一、七種常見的垃圾收集器:
根據(jù)所在老年代還是年輕代列出:
年輕代:Serial、parNew、Parallel Scavenge
老年代:CMS(Cocurrent Mark Sweep)、Serial Old、Parallel Old
年輕代+老年代:G1
二、垃圾收集器具體特點
1、Serial?
年輕代單線程收集器,沒有線程交互的開銷,可以達到單線程最高效率回收。
采用復制算法實現(xiàn)、回收時需要暫停用戶所有線程(stop the world)。
一般適用于client模式下的年輕代收集,因為對象存活率比較低,并且client內(nèi)存分配比較小,雖然停頓,但是幾十毫秒是可以接受的。
可以與老年代的:CMS、Serial Old配合使用
2、Serial Old
跟Serial一樣,老年代的單線程收集器
采用標記-整理算法實現(xiàn),回收時需要暫時所有用戶線程
一般適用于client模式下的老年代的收集。
可以與年輕代的:Serial、parNew、Parallel Scavenge配合使用
? 3、parNew
Serial升級版,年輕代多線程收集器,可以并行收集(并行:多線程工作。并發(fā):用戶線程和手機線程同時工作)。
采用復制算法,單核存在線程交互開銷,在多核機器下效果比較好,回收時需要暫停用戶所有線程(stop the world)。。
可以與老年代的:CMS、Serial Old配合使用
4、Parallell Scavenge
年輕代的多線程并行收集器,與其他收集器關注點不同,主要關注吞吐量(運行用戶代碼時間/jvm總運行時間)
采用復制算法,回收時需要暫停用戶所有線程(stop the world)。。
不需要手動指定年輕代的各區(qū)域大小等,可以動態(tài)設定參數(shù),虛擬機會根據(jù)當前系統(tǒng),動態(tài)調(diào)整最適合的垃圾回收停頓時間,達到需要的吞吐量。
可以與老年代的:Serial Old、Parallel Old配合使用
5、Paraller Old
老年代多線程并行收集器,關注點也是吞吐量,同Parallell Scavenge
采用標記整理算法,回收時需要暫停用戶所有線程(stop the world)
可以與新生代的:Parallell Scavenge配合使用
6、CMS
老年代的多線程并發(fā)并行收集器,以獲取最短回收停頓時間為目標,常用語互聯(lián)網(wǎng)B/S架構
采用標記清除算法,過程為:初始標記(stop the world)-并發(fā)標記-重新標記(stop the world)-并發(fā)清除
缺點:
1、對cpu比較敏感,雖然并發(fā)清除期間不暫停用戶線程,但是清除會占用一部分cpu資源,導致響應比較慢
2、咋并發(fā)清除階段產(chǎn)生的浮動垃圾,無法處理
3、標記-清除,會產(chǎn)生空間碎片。長時間后會導致fullgc。
7、G1收集器
1、年輕代和老年代通用的收集器,并發(fā)并行收集器,但是現(xiàn)在生產(chǎn)環(huán)境還未大量使用
2、G1與cms不一樣,使用標記-整理算法,沒有空間碎片。
3、G1可以控制一次垃圾回收的停頓時間:其余的收集器,要么是針對年輕代、要么是針對老年代,G1的策略不同,將堆的內(nèi)存布局分為大小相同的n個region,可以有計劃的對region進行回收,而不想其他收集器,必須對整個年輕代或者整個老年代回收。當需要進行垃圾收集的時候,g1會維護一個region優(yōu)先手機列表,根據(jù)允許的收集時間來覺得對那些region進行最高效的回收。
4、g1的垃圾回收是針對于region來做的,這就產(chǎn)生了一個問題,可能當前收集的region中對象,會跟其他沒有分配收集region中的對象有關聯(lián)關系,這一般就需要全局掃描,很耗費時間,但是g1中,region之間的對象引用都使用一個叫Remembered Set來記錄,每一個region都有一個set,虛擬機發(fā)現(xiàn)對引用類型數(shù)據(jù)操作時,會檢查引用是否處于一個region中,如果不是則記錄到set中去。這樣在回收region的時候,只需要查看set就能做到對其余region回收的不遺漏。
5、g1垃圾收集過程:初始標記(stop the world)-并發(fā)標記-最終標記(stop the world)-篩選回收(stop the world)
三、空間分配擔保
都知道,gc回收分年輕代和老年代,當使用復制算法進行回收的時候,會將當前使用的eden和suviovor中的可用對象,復制到另外一個siuvivor中。這時候,如果suvivor中的空間裝不下可用的對象,那么怎么辦呢?這就是空間分配擔保要解決的問題,會將一些年輕較大的對象移動到老年代。那么在年輕代進行minor gc的時候,會進行什么操作?首先會檢查老年代的最大可用空間是否大于新生代所有對象的總和,如果成立可以保證直接可以進行gc。如果不成立,那么有一個擔保失敗的參數(shù),如果該參數(shù)設置為允許,那么繼續(xù)檢查老年代最大可用連續(xù)空間是否大于歷次晉升到老難帶對象的平均大小,如果大于,那么直接進行minorgc,否則那么直接進行一次fullgc。當然這里也是有風險的,可能雖然可用連續(xù)空間是否大于歷次晉升到老難帶對象的平均大小,但是這次直接大于不夠了,如果不夠的話,也只能重新進行一次fullgc了。
轉(zhuǎn)載于:https://www.cnblogs.com/guoliangxie/p/7384661.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的五、jvm垃圾回收3(几种垃圾收集器)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Java从入门到放弃》框架入门篇:hi
- 下一篇: Yii2 中cookie的用法(2)