在社會化分工、軟件行業細分專業化的趨勢下,會真的參與到底層系統實現的人確定是愈來愈少(比例上說)。真的會參與到JVM實現的人確定是少數。程序員
但若是您對JVM是如何實現的有興趣、充滿好奇,卻苦於沒有足夠系統的知識去深刻,那麼能夠參考RednaxelaFX整理的這個書單。算法
本豆列的脈絡是:
編程
要了解JVM是如何實現的,首先必需要知道JVM究竟是什麼、不是什麼,表面上應該提供怎樣的功能。爲此,JVM規範必讀,並且應該時常放在手邊參考。segmentfault
而JVM的主要服務對象是Java編程語言。雖然JVM也能夠支持衆多其它語言,但JVM裏的「J」仍然最重要,Java的語言特性影響了JVM的原始設計,因此Java語言規範也應該閱讀。特別是,JVM關於線程和同步相關的規定都是交由Java語言規範的相關章節定義的。
安全
這裏選取《Virtual Machines: Versatile Platforms for Systems and Processes》,幫助您瞭解「虛擬機」一詞到底指代什麼,有什麼不一樣類型,大概有哪些實現方法,等等。讀完這本書有助得到一個清晰的大局觀。
jvm
雖然這幾本並無深刻到JVM實現的很是細節的角落,但對已經習慣用Java語言編程的程序員來講,有這麼幾本書帶領本身從熟悉的領域進入不熟悉的領域老是件好事。編程語言
這幾本書中,最深刻JVM內部的是《Oracle JRockit: The Definitive Guide》;有豐富調優建議的是《Java Performance》;結合實現大概介紹JVM的抽象概念的是周志明的《深刻理解Java虛擬機》。
ide
先經過《Language Implementation Patterns》瞭解編程語言的一些入門級實現方式,把高級語言編譯器與虛擬機兩個概念聯繫起來。
而後經過《プログラミング言語を做る》瞭解很是簡易的、用樹遍歷式以及字節碼式解釋器實現虛擬機大概是個怎麼回事。雖然這本書沒有實現JVM,但它介紹的Diksam與早期JVM的實現很有類似之處,可參考。
接下來《深刻嵌入式Java虛擬機》介紹了一種實際的JVM——KVM的實現細節。KVM是CLDC的參考實現(RI)裏的JVM,結構簡單,資源消耗小,適合入門閱讀。
這部分最後是《The School of Niklaus Wirth》,裏面有一章介紹了HotSpot Client Compiler 的原始設計思路。這是個很是簡單、但相對來講性能還不錯的JIT編譯器,可用於對JIT編譯器的基本瞭解。這本書自己就很贊,不爲學習虛擬機也能夠一讀。
須要注意的是從「簡易的JVM實現」到「高性能、複雜的JVM實現」跨度很是大;前者的許多部分的實現方式與後者至關不一樣。先從簡易的實現開始入手主要是爲了對JVM裏大概都有些什麼組件有所瞭解。但若是目標是瞭解高性能JVM的實現,那就必須在GC、編譯原理方面打下更好的基礎,從新洗一次腦。性能
下面要開始逐漸深刻JVM的內部實現,若是沒有良好的C或(與?)C++基礎會比較吃力。雖然也有幾乎徹底用Java語言實現的高性能JVM,例如Maxine VM與Jikes RVM,但它們都是研究性質的;商用JVM實現仍然是C與C++的天下。
這裏我先推薦C++之父本身寫的那本書來入門。雖然BS巨巨後來還出過本新書,而近來也漸漸開始有介紹C++11的入門書,但實際上如今多數JVM實現用的仍是C99或很是古老的C++(連C++03都不必定用到了),因此用這本老書應該就夠了。學習
而後經過《深度探索C++對象模型》來學習C++對象模型的常見實現方式。這對後面理解Java對象模型的實現頗有幫助。
GC書總共就那麼幾本,倒也沒啥可挑的。《The Garbage Collection Handbook》是絕對必讀。
編譯原理的書就稍微尷尬些。現有的編譯原理書大都針對靜態編譯器、針對像C或C++那樣的偏靜態、偏native的語言。我還沒讀到過什麼編譯原理書是專門介紹JIT編譯器或者說動態編譯器的。靜態與動態編譯器會有些取捨上、實現策略上的差別,不過還好其核心的原理都是同樣的,因此仍是能夠推薦幾本書。龍書用來最初入門,鯨書用來補充一些優化相關的知識,EAC第二版用來學習編譯器一種比較良好的邏輯組織方式,最後學一下針對現代機器的優化。
實際JVM實現裏,若是有JIT編譯器或者動態編譯器那它們的編譯目標多半是底層機器的機器碼。這就涉及到計算機體系結構了。
若是您只對Java語言和抽象的JVM有必定了解,那能夠用《計算機組成及彙編語言原理》來入門。這本書比較奇葩,用JVM的字節碼指令集來看成真實機器介紹體系結構的概念。我並不太喜歡這本書,但感受它對有Java背景的初學者來講應該有點用。要注意的是千萬別隻讀這本書來入門,請結合CSAPP來從新洗一次腦。
若是對C或C++已經有所瞭解,那《深刻理解計算機系統》(CSAPP)是計算機體系結構入門的最適合的書了。
到此爲止各類抽象概念應該都瞭解得差很少了。那麼要在真實的機器上實現高性能JVM,就必需要對真實機器的指令集細節有所瞭解。x86/x86-6四、SPARC、ARM、MIPS,要在哪一個平臺上作高性能實現就要學習哪一個平臺的指令集及指令級別優化技巧。這裏就不具體推薦書了。
操做系統層面的知識一樣重要。像是說JVM要實現線程、內存分配啥的,均可能要跟系統調用或CRT對系統調用的包裝打交道。這部分也須要另外找書來讀。我回頭再考慮下要不要加幾本道這個豆列裏來。
另外,從80年代開始高級語言虛擬機的實現技術有了日新月異的發展,但卻沒有專門的書對這個領域作綜述和導讀。多數有用的資料其實仍是在論文裏。光靠讀書是遠遠不夠用的,論文這塊也請關注。
順便廣告一下:個人博客裏關於虛擬機的文章也推薦給你們閱讀:
http://rednaxelafx.iteye.com/blog/362738
這個豆列沒有漏掉《Inside the Java Virtual Machine, Second Edition》,中文版《深刻Java虛擬機(原書第2版)》,只是我如今已經再也不推薦它了。這本書剛出版的時候確實引發了一番學習Java虛擬機的熱潮,但其部份內容從如今的角度看已通過時,特別是涉及JVM實現的部分。像火車算法什麼的如今已經沒有JVM實現使用。不過話說回來,瞭解瞭解這些過期的信息也沒什麼很差,前提是能本身分辨清楚哪些信息是適用於如今的JVM的,而哪些已經成爲了歷史。
另外有一本清華大學出版社出的《解析Java虛擬機開發——權衡優化.高效和安全的最優方案》,這本純粹是對周志明的《深刻理解Java虛擬機》一書的抄襲。然而抄襲也抄得很不給力,印刷、排版都不如原版。建議不要購買。