每日一面——Java的CMS收集器你瞭解多少?

菜雞每日一面系列打卡27

每天一道面試題目 

助力小夥伴輕鬆拿offer

堅持就是勝利,我們一起努力!

題目描述

JavaCMS收集器你瞭解多少?

題目分析

其實,對於JVM內存管理相關問題的考查,很難區分哪道題目出現頻率更高,因爲基本上都是結合在一起考查的。面試官問完了運行時數據區,如果回答得不錯,很自然地就會過渡到垃圾回收算法,進而考查垃圾收集器。

在這裏,菜雞想囉嗦兩句。自動內存管理是Java的一個很重要的特點,它屏蔽了繁雜的內存管理的操作,將其交由垃圾收集器來進行管理,聽起來很棒,但這也導致了Java程序員對底層的生疏,排查問題的困難。因此,很有必要了解JVM內存管理的相關原理,這對排查內存泄漏,內存溢出等問題是至關重要的。

在上一篇文章中,我們講述了垃圾回收的基礎知識,垃圾收集算法和分代收集理論,而本文要講到的就是基於之前理論的實踐篇——垃圾收集器。本文主要講述CMS收集器,它是一款十分經典的垃圾收集器,是HotSpot虛擬機追求低停頓的第一次成功嘗試,直到現在也在被廣泛使用,在面試中也比較熱門。接下來,隨菜雞一起去看看吧!

題目解答

01

CMS收集器基礎

CMS收集器全稱Concurrent Mark Sweep收集器。讓我們先來通過名字YY一下這款收集器的特點:Concurrent,能併發收集Mark Sweep,採用標記-清除算法?很遺憾……這些YY都是對的,這也說明CMS這個命名相當成功啊。

咳咳,嚴肅一點。

  • CMS收集器是一種以獲取最短回收停頓時間爲目標的收集器。它適用於對服務響應速度要求比較高的場景,因爲這類系統希望停頓時間儘可能短,從而帶給用戶更好的交互體驗。

  • CMS收集器是基於標記-清除算法實現的。CMS的標記-清除過程分爲4個步驟。

    • 初始標記(stop the world):標記GC Roots能直接關聯到的對象。

    • 併發標記(concurrent):GC Roots的直接關聯對象遍歷整個對象圖。

    • 重新標記(stop the world):修正併發標記期間用戶線程運作過程中產生變動的對象的標記記錄。

    • 併發清除(concurrent):清除死亡的對象。

02

對CMS收集器的評價

  • 優勢

    • 併發低停頓。根據上述內容,由於初始標記與重新標記階段的耗時遠小於併發標記和併發清除階段的耗時,因此,可以稱CMS是一款併發低停頓的收集器。

    • 提高用戶體驗。基於併發低停頓的特點,CMS收集器成爲了追求用戶體驗場景下的優秀選擇。

  • 缺點

    • 對處理器資源非常敏感。併發過程很喫CPU,會降低總吞吐量。

    • 無法處理“浮動垃圾”。所謂的浮動垃圾是指在併發標記和併發清理階段產生的新的垃圾對象,這部分對象如果逃脫了標記過程,就不能在當次垃圾手機過程中被回收。

    • 基於標記-清除算法會產生大量內存碎片。上篇文章已經提到過,標記-清除算法的後遺症就是會產生大量的內存碎片,碎片過多會導致大對象申請連續空間失敗,而不得不提前觸發Full GC。爲了應對這種問題,在內存碎片過多時,CMS收集器會採用標記-整理算法收集一次,以獲得規整的空間。

參考資料

《深入理解Java虛擬機》第3版 周志明

相關鏈接

每日一面——Java的垃圾回收你瞭解多少?

學習 | 工作 | 分享

????長按關注“有理想的菜雞

只有你想不到,沒有你學不到

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