深入JVM,帶你快速、透徹理解G1回收的原理和實現!
前幾年,圖靈在 R 大( RednaxelaFX /莫樞)的大力推薦下,引進了一本日系技術書《垃圾回收的演算法與實現》(下文簡稱 GC 書),一直關注圖靈的讀者可能對這本書還有些印象。
GC 書分為“演算法篇”和“實現篇”兩大部分,介紹了標記-清除演算法等 9 種重要的 GC 基礎演算法,以及 GC 在 Python 等 4 種語言處理程式中的具體實現。
用 R 大的話說,這本書非常適合用於入門——它既系統地介紹了 GC 的經典基礎演算法(及其若干變種),又貼近現實剖析了一些實用系統中的 GC 實現,在抽象與具體,理論與實現之間找到了一個不錯的平衡。
GC 書實現篇的作者是中村成洋。他因為偶然的機會對 GC 產生濃厚興趣,本人卻說不清為何喜歡 GC。被人追問原因時,總是回答“是緣分”。
中村成洋
中村是 CRuby 的 committer,現在仍每天致力於 GC 的改善。
在 GC 書的原稿中,有一章是關於“HotSpotVM 的實現”,但因為時間關係,沒來得及出版。GC 書正式出版後,中村才繼續寫作這部分。
一開始,他計劃只介紹 G1GC 的實現,但是在寫作過程中漸漸改變了想法,覺得還是先寫一些演算法原理更有助於讀者理解,所以又開始埋頭寫 G1GC 的演算法原理。
於是,就有了今天我們要介紹的這本《深入 Java 虛擬機器:JVM G1GC 的演算法與實現》。
和 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 過程更直觀、易懂。轉移專用記憶集合的構造
GC 單位時間內的 GC 暫停時間上限
mutator 和 GC 的執行關係 通俗易懂
中村在寫作中不僅融入了自己的獨到見解和研究成果,還巧用“打比方”的手法深入淺出。比如在講解 Java 監視器時,中村將其比喻為滑雪板租賃商店,在後面講解監視器的實現時也一直使用這個例子幫助讀者加深理解。監視器與租賃商店
原始碼剖析
演算法篇剖析 HotSpotVM 原始碼時,只列出主流程的程式碼,並附上細緻解釋,易讀性高。ConcurrentMark 類的實現
生動有趣
書中專欄插入了幾幅中村自己畫的小漫畫,靈魂畫風,卻極其傳神。保守式 GC(不能識別指標和非指標的 GC)與準確式 GC(能夠正確識別指標和非指標的GC)
| 讀者物件
這本書適合所有對 JVM、GC 和 JDK 記憶體管理感興趣的讀者閱讀。
這本書可以說是對 GC 書的補充,彌補了 GC 書未深入講解並行 GC/併發 GC,未涉及 JVM GC 的不足,相對來說更加貼合 Java 從業者。只要讀過 GC 書,應該就能理解本書的內容。
不過即使沒有讀過,只要具備一些 GC 的基礎知識,閱讀本書也不成問題。具體來說,需要事先掌握標記-清除 GC、複製 GC 和增量 GC 等的基礎演算法。
如果不具備任何 GC 相關的知識,而且也不打算閱讀 GC 書,那麼建議先自己在網路上簡單瞭解一下 GC。
作為 Javaer 必拜山頭之一,JVM 一直帶有那麼一些神祕感。希望這本書能幫助大家進一步打破這種神祕感,知其然並知其所以然,瞭解底層又不拘泥於底層,寫起程式碼來更加得心應手。
相關文章
- 從JAVA記憶體到垃圾回收,帶你深入理解JVMJava記憶體JVM
- 總結《深入理解JVM》 G1 篇JVM
- 深入理解Java的垃圾回收機制(GC)實現原理JavaGC
- 深入理解JVM(3)—垃圾回收JVM
- 帶你掌握JVM垃圾回收JVM
- 深入理解JVM虛擬機器2:JVM垃圾回收基本原理和演算法JVM虛擬機演算法
- 《深入理解JVM》10-垃圾回收JVM
- 深入理解JVM(五)——垃圾回收器JVM
- 【轉】深入理解JVM--JVM垃圾回收機制JVM
- 深入理解 JVM 之 垃圾回收機制JVM
- 徹底理解閉包實現原理
- 那些你不知道的Dart細節之帶你透徹理解非同步Dart非同步
- 深入理解JVM(四)——垃圾回收演算法JVM演算法
- 帶你徹底理解 Android 中的 Window 和 WindowManagerAndroid
- 一題帶你徹底理解sleep()和wait()AI
- 深入理解ReentrantLock的實現原理ReentrantLock
- JVM中G1垃圾回收器詳細解析JVM
- 深入理解JVM——(二)搞定JVM垃圾回收就是這麼簡單JVM
- 快速理解容器技術的實現原理
- 快速理解Go陣列和切片的內部實現原理Go陣列
- 深入探究JVM之垃圾回收演算法實現細節JVM演算法
- 深入理解 Taier:MR on Yarn 的實現原理AIYarn
- 深入理解JVM(一)——基本原理JVM
- 深入理解Vue的watch實現原理及其實現方式Vue
- 阿里大佬帶你,深入理解執行緒池底層原理阿里執行緒
- 深入理解Java中的HashMap的實現原理JavaHashMap
- 帶你理解Lock鎖原理
- 高併發,你真的理解透徹了嗎?
- 一文帶你瞭解 JVM 的垃圾回收機制JVM
- 深入理解Vue的computed實現原理及其實現方式Vue
- 深入理解JVM(六)——類載入器原理JVM
- 理解JVM(七):垃圾回收器JVM
- 視覺化Java垃圾回收的原理和實現視覺化Java
- Android ListView工作原理完全解析,帶你從原始碼的角度徹底理解AndroidView原始碼
- 深入 Go 的 Map 使用和實現原理Go
- 深入探究JVM之垃圾回收器JVM
- 深入理解 JVMJVM
- 深入理解JVMJVM