如何評價《垃圾回收的演算法與實現》及作者中村成洋?

英子發表於2016-08-24

作者:RednaxelaFX(莫樞)
連結:https://www.zhihu.com/question/39337535/answer/80884071
來源:知乎
著作權歸作者所有,轉載請聯絡作者獲得授權。

關於R神

莫樞,現就職於Azul Systems參與Zing JVM的JIT編譯器研發。曾就職Oracle與阿里巴巴參與HotSpot VM的研發。熱愛程式語言的設計與實現,喜歡學習和鼓搗各種程式語言,對託管執行時的設計與實現有深入瞭解。常用網名RednaxelaFX。


嗯,這本書的中文版快出了,真是欣慰!

原版剛出的時候我就趕緊在日本Amazon上買了。後來達人出版會發行了這本書的電子版,我還又買了一次電子版以表支援。

關於中村成洋

中村成洋大大的Twitter賬號是@nari3(日文)和@nari_en(英文)。個人網站(包括部落格)在narihiro.info。他的工作中我所關注的部分是他對CRuby的GC的改進,例如CRuby 1.9的lazy sweep、CRuby 2.0的bitmap marking等。

感覺他是個平易近人的程式設計師,跟他討論問題時氛圍總是輕鬆活潑的。

他好學且勤於實踐。跟許多其他日本程式設計師一樣,他樂於並擅長閱讀開原始碼,並且記下學習筆記。

《垃圾回收的演算法與實現》書中,原始碼剖析(“實現”)的部分主要是中村大大寫的。原本這本書還計劃包含對G1 GC的原始碼剖析,但時間和篇幅實在是安排不下,他就另外通過達人出版會出版了G1 GC原始碼剖析的上下兩冊書:

關於這本書

原版是「ガベージコレクションのアルゴリズムと実裝」,中文版由圖靈引進,譯者是丁靈。

我在自己的幾個書單裡都有放這本書:
[Garbage Collection][垃圾回收][自動無用記憶體單元回收]相關讀物
從表到裡學習JVM實現

從入門到進階閱讀學習GC知識,這本可以作為第一本書;後面接上老的 Garbage Collection 也行,或者跳過這本老的直接到 The Garbage Collection Handbook 亦可。

這本書覆蓋了老 Garbage Collection 書的大部分基本演算法和變種介紹,如果不是特別想考古或者說想把GC領域的歷史都挖出來看看的話,就可以跳過這本老書了。

這本書所覆蓋的內容,看目錄就一目瞭然了:


目次 - ガベージコレクションのアルゴリズムと実裝 [単行本] - Amazon.co.jp
序章
アルゴリズム編
第1章 GCを學ぶ前に
第2章 マークスイープGC(Mark Sweep GC)
第3章 參照カウント(Reference Counting)
第4章 コピーGC(Copying GC)
第5章 マークコンパクトGC(Mark Compact GC)
第6章 保守的GC(Conservative GC)
第7章 世代別GC(Generational GC)
第8章 インクリメンタルGC(Incremental GC)
実裝編
第9章 PythonのGC
第10章 DalvikVMのGC
第11章 RubiniusのGC
第12章 V8のGC
補遺


中文版裡,原作者之一的相川光還專門在演算法篇新加了一章講RC Immix的,一種結合tracing與引用計數的新演算法。作者太好人了 >_<


版權宣告
審校者前言
前言 閱讀
謝辭 閱讀
本書評論
序章
演算法篇
第 1 章 學習 GC 之前
第 2 章 GC 標記 - 清除演算法
第 3 章 引用計數法
第 4 章 GC 複製演算法
第 5 章 GC 標記 - 壓縮演算法
第 6 章 保守式 GC
第 7 章 分代垃圾回收
第 8 章 增量式垃圾回收
第 9 章 RC Immix 演算法
實現篇
第 10 章 Python 的垃圾回收
第 11 章 DalvikVM 的垃圾回收
第 12 章 Rubinius 的垃圾回收
第 13 章 V8 的垃圾回收
附錄
後記
參考文獻


其中實現篇裡介紹的GC,具體是:

  • Python 3.0.1。其引用計數以及備份的mark-sweep GC(所謂Cycle GC)都有介紹。在講解GC的概念與思路上,這章比《Python原始碼剖析》寫得好。

  • Dalvik VM Android 1.5r2 (Cupcake)版。重點是:分塊的GC堆、mark-sweep GC、bitmap marking。
    當然,現在看來這是比較老的Dalvik VM,後來新加的併發GC(Concurrent Mark-Swep)、copying GC都沒有介紹。

  • Rubinius,基本上反映了1.0.0版的狀況。Rubinius的GC是分代式的,young gen為copying GC,old gen為Immix GC。本書的原始碼剖析只著重介紹了其young gen的實現,以及準確式GC的實現方式。

  • V8 1.3.13.5。重點是:GC堆的劃分、tagged pointer、準確式GC的實現、old gen的mark-compact。
    這從現在看來也很老了。後來的V8的GC發展得相當複雜,不過要追根溯源還是能找到跟早期版本相似的基本思路。

這樣,4個實現就分別覆蓋了引用計數、mark-sweep、copying與mark-compact演算法在實際VM中的實現與應用。理論結合了實際。

優缺點

我特別推薦《垃圾回收的演算法與實現》,求出版社引進中文版,是因為它非常適合用於入門。它既系統的介紹了GC的經典基礎演算法(及其若干變種),又貼近現實剖析了一些實用系統中的GC實現,在抽象與具體,理論與實現之間找到了一個不錯的平衡。

有不少著眼入門水平的書在這種平衡點上就拿捏得不好:

  • 要麼通篇理論,過於抽象,難以結合程式碼形象的理解,讀完書還是實現不出東西來;
  • 麼過於注重單一特定的簡單實現,缺乏大局觀,難以讓讀者有效的萃取出重點思路舉一反三泛化到理解整個領域。

而且這本書通篇的記述都配合著大量形象的插圖,非常有助於讀者理解其相關文字描述。

要說讀得不過癮的地方,那就是演算法篇中對GC知識的系統性把握還是不如 The Garbage Collection Handbook ;而實現篇中剖析的物件從現在的角度看版本偏老,而且有些系統實現得複雜的地方被略過了(例如分析Rubinius的GC時只分析了young gen的copying GC,而沒有分析old gen的Immix GC),讀完真恨不得給它加幾個小章節…

但即便如此,這本書既授人以魚,也授人以漁,讀者瞭解了分析程式碼的思路後,結合演算法篇裡對領域的介紹,要去閱讀其它GC實現的原始碼也就會有頭緒了。所以那些缺失的原始碼剖析,就算是留給讀者的習題吧(>_<

相關文章