深入JVM,帶你快速、透徹理解G1回收的原理和實現!

圖靈小悅發表於2021-01-12

前幾年,圖靈在 R 大( RednaxelaFX /莫樞)的大力推薦下,引進了一本日系技術書《垃圾回收的演算法與實現》(下文簡稱 GC 書),一直關注圖靈的讀者可能對這本書還有些印象。

enter image description here

GC 書分為“演算法篇”和“實現篇”兩大部分,介紹了標記-清除演算法等 9 種重要的 GC 基礎演算法,以及 GC 在 Python 等 4 種語言處理程式中的具體實現。

用 R 大的話說,這本書非常適合用於入門——它既系統地介紹了 GC 的經典基礎演算法(及其若干變種),又貼近現實剖析了一些實用系統中的 GC 實現,在抽象與具體,理論與實現之間找到了一個不錯的平衡。

GC 書實現篇的作者是中村成洋。他因為偶然的機會對 GC 產生濃厚興趣,本人卻說不清為何喜歡 GC。被人追問原因時,總是回答“是緣分”。

中村成洋
enter image description here

中村是 CRuby 的 committer,現在仍每天致力於 GC 的改善。

在 GC 書的原稿中,有一章是關於“HotSpotVM 的實現”,但因為時間關係,沒來得及出版。GC 書正式出版後,中村才繼續寫作這部分。

一開始,他計劃只介紹 G1GC 的實現,但是在寫作過程中漸漸改變了想法,覺得還是先寫一些演算法原理更有助於讀者理解,所以又開始埋頭寫 G1GC 的演算法原理。

於是,就有了今天我們要介紹的這本《深入 Java 虛擬機器:JVM G1GC 的演算法與實現》。

enter image description here

和 GC 書一樣,這本書由“演算法篇”和“實現篇”兩大部分構成。

在演算法篇中,這本書探討了 OpenJDK 7 中引入的 GC 演算法——G1GC(Garbage First Garbage Collection)的原理。G1GC 中有一個很大的謎團,那就是 GC 暫停處理的預測暫停時間。演算法篇用了數十頁的篇幅來揭示它。

關於 G1GC 的資料,具有代表性的是由 David Detlefs 等人所寫的英語論文 Garbage-First GarbageCollection。但是那篇論文非常深奧晦澀,只讀一遍是無法透徹理解的。

中村初次接觸那篇論文是在 2007 年。當時他的英語閱讀能力有限,也不怎麼了解 GC,所以沒讀多少就放棄了。3 年後,他掌握了一定程度的 GC 知識,所以再次挑戰了那篇論文——結果仍然沒能徹底理解。

在那之後的半年多裡,中村讀完論文讀原始碼,讀完原始碼又去讀論文,如此反覆,終於徹底理解了全部內容。對於他來說,理解 G1GC 的過程可以稱得上“荊棘之路”。

《深入 Java 虛擬機器》的演算法篇,比原始論文更加詳細地介紹了 G1GC 的演算法原理和執行過程。對於自己以前理解起來比較困難的地方,中村還特意進行了詳細的說明,因此內容要比原始論文易於理解。即使是不太瞭解 GC 的讀者,理解起來也沒有什麼問題。

在實現篇中,中村又詳細剖析了 HotSpotVM 的原始碼。

HotSpotVM 實現了包括 G1GC 在內的多種 GC 演算法。不過這些演算法並非憑空而來,而是基於 HotSpotVM 中專為 GC 演算法設計的框架實現的。因此,中村會帶大家去了解作為框架之一的物件管理功能。得益於物件管理功能的介面,多種 GC 演算法之間的切換成為可能,而且新 GC 演算法的新增也變得更加簡單。

之後,大家還會了解物件的資料結構和記憶體分配器。有關分配器的講解會稍微涉及對作業系統的呼叫。

除此以外,大家還將瞭解 G1GC 中用到的執行緒管理方法。HotSpotVM 內部同樣也有能夠在 GC 過程中簡單地操作執行緒的框架,各種 GC 演算法都是通過這個框架來實現並行 GC 和併發 GC 的。

再後面就是 G1GC 的具體實現,講解了 G1GC 的併發標記和轉移,以及排程程式的實現。這部分儘量省略了演算法篇中已經詳細講解過的內容,著重講解前面沒有涉及的內容。

對於 G1GC,中村曾有過不少疑問。比如“G1GC 是如何實現準確式 GC 的”和“實現了這麼多 GC 不會導致寫屏障變慢嗎”,等等。因此,他研究了 G1GC 的實現方式,並將得到的結果放在了本書的最後兩章。

中村寫作本書的目的在於將他走過的“荊棘之路”變成更多人易於踏上的坦途。希望各位讀者輕鬆愉快地走過這條坦途,用最短的時間掌握 G1GC。

| 圖書特色

  • 圖文並茂
    這本書帶點圖解系列的風格,特別是演算法篇,清晰的配圖讓 GC 過程更直觀、易懂。

    轉移專用記憶集合的構造 enter image description here
    GC 單位時間內的 GC 暫停時間上限 enter image description here
    mutator 和 GC 的執行關係 enter image description here

  • 通俗易懂
    中村在寫作中不僅融入了自己的獨到見解和研究成果,還巧用“打比方”的手法深入淺出。比如在講解 Java 監視器時,中村將其比喻為滑雪板租賃商店,在後面講解監視器的實現時也一直使用這個例子幫助讀者加深理解。

    監視器與租賃商店
    enter image description here

  • 原始碼剖析
    演算法篇剖析 HotSpotVM 原始碼時,只列出主流程的程式碼,並附上細緻解釋,易讀性高。

    ConcurrentMark 類的實現
    enter image description here

  • 生動有趣
    書中專欄插入了幾幅中村自己畫的小漫畫,靈魂畫風,卻極其傳神。

    保守式 GC(不能識別指標和非指標的 GC)與準確式 GC(能夠正確識別指標和非指標的GC) enter image description here

| 讀者物件

這本書適合所有對 JVM、GC 和 JDK 記憶體管理感興趣的讀者閱讀。

這本書可以說是對 GC 書的補充,彌補了 GC 書未深入講解並行 GC/併發 GC,未涉及 JVM GC 的不足,相對來說更加貼合 Java 從業者。只要讀過 GC 書,應該就能理解本書的內容。

不過即使沒有讀過,只要具備一些 GC 的基礎知識,閱讀本書也不成問題。具體來說,需要事先掌握標記-清除 GC、複製 GC 和增量 GC 等的基礎演算法。

如果不具備任何 GC 相關的知識,而且也不打算閱讀 GC 書,那麼建議先自己在網路上簡單瞭解一下 GC。

作為 Javaer 必拜山頭之一,JVM 一直帶有那麼一些神祕感。希望這本書能幫助大家進一步打破這種神祕感,知其然並知其所以然,瞭解底層又不拘泥於底層,寫起程式碼來更加得心應手。

相關文章