菜雞每日一面系列打卡28天
每天一道面試題目
助力小夥伴輕鬆拿offer
堅持就是勝利,我們一起努力!
題目描述
Java的G1收集器你瞭解多少?
題目分析
在上一篇文章中,我們講述了CMS收集器的基礎知識,收集算法及其優缺點,而本文要講到的是另一個里程碑式的垃圾收集器G1(Garbage First)。
上一篇文章提到的CMS收集器是HotSpot虛擬機追求低停頓的第一次成功嘗試,而G1收集器設計之初的目標就是最終替代CMS!事實也確實如此,在JDK9發佈之後,CMS已經被聲明爲Deprecate。
那麼,到底爲什麼G1被稱爲里程碑式的垃圾收集器,又爲何能有望取代CMS收集器呢?接下來,隨菜雞一起去看看吧!
題目解答
01
G1收集器簡介
G1收集器是垃圾收集器技術發展歷史上的里程碑式的成功,它開創了收集器面向局部收集的設計思路和基於Region的內存佈局形式,是一款主要面向服務端應用的垃圾收集器。這段話點出了菜雞認爲G1與其他收集器最大的不同,它是整個設計理念上的轉變。
上一篇文章中我們提到的CMS收集器,是一款優秀的併發低停頓的收集器。而G1的設計者認爲這種低停頓是不夠的,而是需要更進一步的可預測的停頓。所謂的可預測的停頓,就是建立一個“停頓時間模型”,能夠支持指定在一個長度爲M毫秒的時間片段內,消耗在垃圾收集上的時間大概率不超過N毫秒。這給出了一個比較嚴格的數學約束。實現這樣的模型如果還是僅僅依靠之前的設計理念是難以達到的,爲此,G1開創性地採用了基於Region的堆內存佈局。
那麼問題來了,Region是一個怎樣的概念?Region其實就是一個個Java堆的小的分區。在G1的眼中,新生代和老年代是一個邏輯性的定義,而不再是固定的內存區域。換句話說,每個Region可以根據具體情況承擔新生代或老年代的角色,G1會對不同角色施加不同的策略。
02
G1收集器的特點
G1收集器的運作大致分爲以下幾個步驟:
初始標記(stop the world):標記GC Roots直接關聯的對象,並修改TAMS指針的值,讓下一階段用戶線程併發運行時,能正確地在可用的Region中分配新對象。
併發標記(concurrent):從GC Roots開始遍歷對象圖。
最終標記(stop the world):處理併發標記過程中有引用變動的對象。
篩選回收(stop the world):負責更新Region的統計數據,對各個Region的回收進行優先級排序。
G1收集器的特點:
可以指定最大停頓時間。
分Region的內存佈局。
按收益動態確定回收集。
整體基於“標記-整理”算法,局部(Region之間)基於“標記-複製”算法。
03
總結
G1如此優秀,然而並不能說全方位碾壓CMS。事實上,G1只是表現更均衡,因此才“更完美”。垃圾收集器性能的好壞主要有三個評判標準:內存佔用,吞吐量,延遲。想要同時保證三者的完美幾乎是不可能的。其實在工程上,很多時候我們需要基於實際情況尋找一個平衡點。這不是個例,而是普遍存在的,比如服務的CAP理論,也是這樣的一個經典例子。
基於一些客觀事實和某些認識,我們可以嘗試進行如下總結,囿於菜雞的水平,僅供大家參考。很多事物的發展變化,都是有固定到靈活(比如由物理概念轉向邏輯概念),由強限制到弱限制(比如理論的擴展),由粗糙到細緻(比如自定義的出現,以及優先級的概念)。這些基於某些原則下的變化會由整體擴展到局部再回到重塑整體本身。這是抽象的過程,期間會伴隨着模型的建立和更高維度的抽象。
以上便是菜雞對G1收集器的一些總結,供大家參考。
參考資料
《深入理解Java虛擬機》第3版 周志明
相關鏈接
學習 | 工作 | 分享
????長按關注“有理想的菜雞”
只有你想不到,沒有你學不到