JVM:GC算法和收集器

JVM的垃圾會回收主要發生再堆於方法區。程序計數器,本地方法棧,虛擬機棧等線程私有的內存會隨着線程的消失自動清理內存。

垃圾回收算法

標記清除: 對於可回收的對象先標記再清除,效率高;適用於新生代對象更新頻繁,從而會留下更多大塊的內存區域。
標記整理:先標記,清除再整理,相比標記清楚,多了整理的步驟,所以適用於老生代不會頻繁調用回收機制。
複製算法:將內存分爲兩塊區域,輪流替換使用。不適合對象存活週期長的區域,頻繁的複製會大大降低迴收效率
分代回收算法:根據內存特徵選擇不同的回收算法

判斷對象存活

1,引用計數法:無法解決對象互相循環引用問題
2,可達性分析法:從GCroot開始向下搜索,搜索的路勁就是對象的引用連,而在引用鏈外面的就表示爲不可達對象,即可回收的對象

垃圾回收器

Serial收集器

Serial是比較老的,回收方法比較粗暴的l收集器。採用單線程串行方式回收,新生代使用複製算法,老生到使用標記整理算法,不會產生零碎的內存空間,但是GC在回收時會停止應用系統(stop the world)。

參數控制:-XX:+UseSerialGC 串行收集器

##ParNew收集器是Serial收集器的多線程版本,新生代使用並行的複製算法,老生代使用串行標記整理算法。

-XX:+UseParNewGC ParNew收集器
-XX:ParallelGCThreads 限制線程數量

Parallel收集器

Parlalel收集器和ParNew類似,但是Parallel收集器更關注應用的吞吐量,因此提供可以設定參數控制收集器回收時間,用來保證在垃圾回收時,使系統停頓最短的時間和最大的吞吐量。新生代使用並行的複製算法,老生代使用串行標記整

參數控制:-XX:+UseParallelGC 使用Parallel收集器+ 老年代串行

Parallel Old收集器

這是Parallel收集器比較老的版本,使用並行的標記整理算法
參數控制: -XX:+UseParallelOldGC 使用Parallel收集器+ 老年代並行

CMS收集器

CMS,concurrent mark sweep併發標記清楚,可想而知,該收集器是基於標記清除算法實現的。該收集器重視服務器響應速度,不希望系統出現較長時間的STW(stop the world),在B/S架構和互聯網網站廣泛應用。

基於標記清除算法,但過程比標記清除算法更爲複雜,分爲四步:
1,初始標記
2,併發標記
3,重新標記
4,併發清除

在初始標記和重新標記的時候,仍然會STW。但併發標記和併發清除纔是整個過程中最消耗時間的。
初始標記時,暫停應用,但只是標記與Root GC直接關聯的對象,併發標記則是根據初始標記的結果進行更深的全面標記,這個步驟時與應用並行的。而重新標記,則是標記併發標記階段應用程序產生的新的對象,這個過程也會STW。最後一個併發清除也會和程序一起並行。

優點:併發收集效率高,低停頓。
缺點:併發期間,系統吞吐量降低。
因爲使用標記清除,會產生大量零碎內存空間。需要設定碎片整理,暫停整個應用。

參數控制:
-XX:+UseConcMarkSweepGC 使用CMS收集器
-XX:+ UseCMSCompactAtFullCollection Full GC後,進行一次碎片整理;整理過程是獨佔的,會引起停頓時間變長
-XX:+CMSFullGCsBeforeCompaction 設置進行幾次Full GC後,進行一次碎片整理
-XX:ParallelCMSThreads 設定CMS的線程數量(一般情況約等於可用CPU數量)

G1收集器

G1收集器是目前最前沿的垃圾回收技術,我覺得G1與CMS極爲相似,至少在實現思想上是的,回收步驟大致相同,也是分爲初始標記,併發標記,重新標記,併發清除整理

與CMS相比主要有兩點優化:
1,空間整合:與CMS基於標記清除不同,G1是基於標記整理算法,不會帶來零碎內存空間問題,導致需要分配大塊內存而不足重新出發GC。
2,劃分堆爲Region:其他收集器收集範圍都是新生代和老生代,而G1是把整個堆劃分爲多個大小小相等的區域(Region),但新生代和老生代不再物理隔離,都是一個個獨立的Region.
但G1收集器還有一大特點,可預測停頓,就是開發者可以指定一個N毫秒的時間限制,G1則會根據自己預測的時間模型保證垃圾回收時間不超過設定的時間N。

在這裏插入圖片描述

根據純潔的微笑JVM系列學習:http://www.ityouknow.com/jvm/2017/08/29/GC-garbage-collection.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章