java面試中常問的垃圾收集器CMS和G1是什么?
面試中經常被問到CMS和G1垃圾收集器,故來總結下!
CMS收集器:concurrent mark and sweep,并發標記和清除,追求最少的時間停留的收集器!
CMS執行收集步驟:
1,初始標記:快速標記GC roots能直接關聯到的對象,速度快;需要STW(stop the world)
2,并發標記:進行GC Roots Tracing;(時間長,但是可以和用戶線程并行執行)
3,重新標記:標記并發標記期間,用戶程序繼續運行而導致的標記變化(stop the world)
4,并發清除:并行執行垃圾清除,這一步也會產生浮動垃圾;(時間長,但是可以和用戶線程并行執行)
優點:并發執行效率好,停頓時間短;
缺點:
1,并發清除的時候產生浮動垃圾;
2,標記-清除算法,產生大量的內存碎片,很容易引發full gc;
3,默認啟用的處理線程數為(CPU的個數+3)/4,即至少使用25%的CPU,多的話會是100%;
CMS主要針對老年代的垃圾收集,通常和ParNewGC(新生代收集)一起使用;
G1:將整個堆內存分為大小相等的多個獨立region區,保留新生代,老年代概念,卻沒有做物理隔離,G1記錄每個region中的對象活性,根據用戶設置的停頓時間,選擇活性更低的region進行回收,這樣能降低停頓時間;
G1新生代收集:新生代達到比例的時候進行收集,根據統計信息動態調整Eden和Survivor的大小,合理利用內存;
G1老年代收集:
1,初始標記:跟CMS類似
2,并發標記:跟CMS類似
3,最終標記:跟CMS類似
4,篩選回收:對所有region中的回收成本進行排序,同時根據用戶設定的停頓時間來指定回收計劃,并發清除對象(stop the world)
G1優點:
1,停頓時間可預測:根據用戶設定的停頓時間進行stop the world和gc;
2,region的回收具有優先級:對象收集更有效率和針對性;
3,標記-整理算法:不再有內存碎片產生;
下個帖子將會詳細講一下jvm中的相關內容,需要的朋友一定要關注哦。。