目錄
上文https://blog.csdn.net/e5yrt2/article/details/105515473介紹了常見的垃圾回收算法,這篇文章就來說下以下三種常見的垃圾回收器,本文僅作爲基礎瞭解,並沒有特別深入底層
HotSpot虛擬機提供了7種垃圾收集器,其中適用於新生代的三種,老年代的三種,還有一種新生代老年代都適用
新生代垃圾收集器:Serial收集器,ParNew收集器,Parallel Scavenge收集器
老年代垃圾收集器:Serial Old收集器,Parallel Old收集器,CMS收集器
都適用的收集器:G1收集器
所有垃圾收集器組合情況如下:
圖中連線的收集器表明可以一起搭配使用
ParNew
ParNew垃圾回收器的特點就是多線程回收機制,而Serial卻是單線程回收機制。採用的回收算法就是複製算法。
參數設置:
- -XX:+UseParNewGC:使用ParNew收集器
- -XX:ParallelGCThreads:用來限制垃圾收集的線程數
CMS
CMS(Concurrent Mark Sweep)垃圾回收器採用的是標記清理算法,就是標記出哪些對象時垃圾對象,然後就把這些垃圾對象清理掉。CMS的特點就是採取垃圾回收線程和系統工作線程儘量同時執行的模式處理。
具體分爲以下4個階段:
- 初始標記(CMS initial mark):標記出來所有GC Roots直接引用的對象,這時系統的工作線程會停止,進入Stop the World狀態
- 併發標記(CMS concurrent mark):讓系統線程可以隨意創建各種新對象,對老年代所有對象進行GC Roots
- 重新標記(CMS remark):因爲第二階段有重新創建的對象,會有很多對象沒有標記出來,所以要重新標記,此時再次進入Stop the World
- 併發清除(CMS concurrent sweep):清理之前標記爲垃圾的對象即可
G1
上文中ParNew和CMS分別是新生代和老年代的垃圾回收器,但是它們都存在一個很不舒服的地方,就是有Stop the World現象,這個隊系統運行影響是很大的,由此也就引出了G1垃圾回收器
G1是可以同時回收新生代和老年代的垃圾的,它的特點就是把Java堆內存拆分爲多個大小相等的區域(Region )
具體的新生代和老年代可能是如下圖這樣分配的
G1回收器的主要思路就是在一個時間內,垃圾回收導致的系統停頓時間是可以指定的,我們可以控制垃圾回收對系統性能的影響。
那麼如何做到呢?
G1可以做到讓你來設定垃圾回收對系統的影響,他自己通過把內存拆分爲大量小Region,以及追蹤每個Region中可以回收的對象大小和預估時間,最後在垃圾回收的時候,儘量把垃圾回收對系統造成的影響控制在你指定的時間範圍內,同時在有限的時間內儘量回收儘可能多的垃圾對象。簡單說就是有多大能力(設定時間)幹多大事(回收多少垃圾)。