JVM基礎到實戰05-垃圾收集器

1.serial垃圾收集器(串行

運行過程:

特點:
1,是一個單線程的垃圾回收器,stop the word,進行垃圾回收時,必須暫停其他所有的用戶線程
2,使用場景,多用於桌面應用,client的垃圾回收器
3.  桌面應用內存小,進行垃圾回收的時間比較短,只要不頻繁的停頓就可以

2.ParNew垃圾回收器

是什麼?
ParNew僅僅是serial回收器的多線程版本

運行過程:

特點:
1.與性能無關但是很重要的一個特性是:除了serial收集器外,目前只有他能與CMS收集器配合工作

使用:-XX:ParalleGCThreads來限定垃圾收集器的線程數
如何確定線程呢? 對應CPU核數,例如:8核CPU,限定8條線程就可以,
原因:多線程存在上下文切換的時耗問題,並非越多越好

併發與並行? CMS垃圾收集器併發執行!(主要用來回收老年代)

並行:多條線程並行工作,但此時用戶線程任處於等待狀態
併發:至用戶線程與垃圾收集器線程同時執行(不一定並行,可能交替執行),
用戶佔有一個CPU線程,垃圾收集器佔用另一個CPU線程

3.parallel Scavenge垃圾收集器

parallel scavenge和parNew一樣是多線程垃圾收集器!是一個使用複製算法的垃圾回收器
由於與吞吐量關係密切,又被成爲吞吐量優先收集器
吞吐量:CPU運行用戶代碼的時間與CPU總時間的比值,99%執行用戶線程,1%時間收垃圾
吞吐量時99%
特點:
parallel scavenge 收集器的特點是它的關注點與其他收集器不同,CMS等收集器的關注點是儘可能的縮短
垃圾收集使得用戶線程等待時間,而Parallel Scavenge收集器的目標則時達到可控制的吞吐量。

-XX:MaxGCPauseMillis  GC停頓時間?500M--->回收爲300M,這個參數配置太小,會發生頻繁GC(時間短,單次回收不完,每次只能釋放一部分內存)
-XX:GCTimeRatio   GC時間佔比99%

serial old收集器,單線程收集器,用在老年代,使用標記整理算法
parallel old收集器,多線程+標記整理算法

4,CMS垃圾收集器

是什麼?
CMS收集器是以最短回收停頓時間爲目標的垃圾回收器
目前的很大一部分java應用集中在互聯網站或者B/s系統的服務端上,這類引用尤其重視響應速度

步驟:
初始標記:GCROOT算法標記存活對象,速度很快
併發標記:執行GCRootTracing,GC節點跟蹤
重新標記:修正因爲併發標記時用戶線程導致的標記變動
併發清除:執行清除
缺點:
1.對Cpu資源非常敏感,併發標記過程佔用Cpu資源,而且還能開多線程
2.無法處理浮動垃圾,浮動垃圾:執行併發清除時產生的垃圾就叫浮動垃圾

5.G1收集器
是什麼?
是面向服務端的垃圾收集器
特點:
G1對新生代老年代不明感,而是直接將內存分爲多個regin,每個region都有與之對應的rememberedSet,當進行內存回收時,在GC根節點的枚舉範圍中加入RememberSet,即可保證不對全堆掃描也不會有遺漏,檢查reference引用對象是否處於不同region

步驟:
初始標記:GCroot關聯到的對象
併發標記:對GCroot進行可達性分析,找出存活對象,耗時較長,可與用戶線程併發執行
最終標記:修正因用戶線程執行引發的標記變動,虛擬機將這段時間對象的變化記錄在remembered set logs裏,最終標記階段需要把remembered set logs中的數據合併到remembered set中
篩選回收:live data counting and evacauation

優點:
1.空間整合,region內標記整理算法,region之間採用複製算法
2.可預測停頓,這是G1相對CMS的一大優勢,降低停頓時間是G1和CMS的共同關注點,但G1可以建立可預測的停頓時間模型
3.G1不在按照新生代老年代來回收
4.G1垃圾回收時不對全堆進行垃圾收集,而是追蹤每個region垃圾堆積的價值大小(
回收時間和回收獲得的空間大小),後臺維護一個優先列表,每次根據允許時間,優先回收價值最大的region,這也是
Garbage-first名稱的由來,這種使用region劃分內存空間以及有優先級的區域回收方式,保證了
在有限的時間內獲取最高價值內存空間的能力

 

 

 

 

 

 

 

 

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