緣起

繼續從讀書筆記的角度來系統的學習《Advanced Design and Implementation of Virtual Machines》。 這本書是英文編寫,全部、認真、深入的讀下來非常考驗人。 我之前也只是讀了60%,而且越到後面越沒有耐心。 想了想,JVM在系統層面上要達到一定水準,可能還是得精讀一到兩本這樣的書籍。 記讀書筆記是我學習知識和技能的一種比較好的方式,伴隨我至少20多年了。 暫且給這次的讀書筆記取名“關於VM的理論”。

本篇 介紹第III部分中的:

  • 第九章“Garbage Collection Support”

  • 第十章“Runtime Helpers”

  • 第十一章“Exception-Throwing”

  • 第十二章“Finalization and Weak References”

  • 第十三章“Modularity Design of VM”

正式開始本篇之前,我有必要推薦一本書。

推薦一本書 《深入理解Kotlin協程》

有個年輕的小夥伴Benny寫了一本《深入理解Kotlin協程》的書。

書封皮最後有我寫的推薦語,但很可惜是被閹割過的( 理解出版社編輯的做法 ,他們並不清楚技術人對技術觀點,認識上的“反覆無常 )。

如何正確看待協程?我個人是有一個相當大的轉變的。先看推薦語的原文——

我最開始對kotlin和協程是比較“輕視”的,覺得它們無非是語法糖以及線程相關知識的新壇裝舊酒。但隨着我對JVM以及近些年來一些現代高級編程語言的深入學習,我突然意識到Kotlin其實遠不只是基於Java,它天然就包含很多現代高級語言的特性。而協程在kotlin語言的加持下針對併發編程的痛點上更是進了一大步。很難得Benny能深入撰寫一本這樣的關於協程方面的論著。這本書並不簡單,但值得各位讀者深入學習。

其實, 周志明老師在深入理解JVM最新版的書裏也提到, 協程 很可能在Java後續版本 得到支持,當然也是JDK裏提供的——一個比較類似的例子就是C++11裏STL搞了一個併發庫一樣。

本篇介紹什麼

本篇內容見下圖,對應原書中的第III部分最後的9到13章。

這幾章內容看起來是相對比較痛苦的。痛苦的感覺是不知道講了什麼,不知道有什麼用。所以,我們先大概說下這幾章討論的是什麼問題。BTW,這幾章之間的關聯關係並不大,你可以選擇感興趣的閱讀。

  • 第九章Garbage Collection Support:主要講JVM中如何實現對root對象的枚舉。尤其是在遍歷調用棧時,哪些寄存器裏存的是對象這類問題。與之有關的一個經常碰到的詞叫GC-Map。我在《深入理解Android JVM ART》一書裏也簡單的提到過這個對應的一個詞叫StackMap。但這塊內容非常複雜。

  • 第十章Runtime-Helpers:看章節名稱肯定是不知道在講什麼。Runtime-helper是書裏經常提到的一個詞,其根源是作者基於JVM模塊化設計思路之上(第十三章Modularity Design of VM),將某些功能抽在一起集中研究。我在ART裏並沒有看到這樣的一個單獨模塊。但與之有關的功能肯定是有的。比如,書中提到的Runtime-Helper,其價值在於“When Java code execution needs the VM-services, a runtime-helper is called that helps

    transition the control from the Java world to the native world

    ”。在這裏,native word包括JNI層以及JVM自身的服務(例如拋異常,例如MONITORENTER的實現等)。另外,我想說下,這種劃分是從模塊化設計角度來看的,但離具體場景有些遠,不太好學習(雖然這一章最後列了一些場景....)。這一章我不太想講太多,比較乾癟。

  • 第十一章"Exception-Throwing":這一章內容非常明確,就是將異常投遞。我在研究ART裏異常投遞的時候,碰到的最大困難還是在於棧回溯和寄存器有關的內容。我曾經在去上海蔘加Droidconf 2018大會的火車上思考了好幾個小時。當然,看了這本書之後我有了一些新的感受。上篇好像也提過,就是我們對彙編開發時對函數調用的不熟悉。如果有彙編寫函數調用,棧都是要自己維護和處理的。哪些寄存器幹什麼用都是套路。只可惜我們對這些套路都不太瞭解。

  • 第十二章"Finalization and Weak References"。專門介紹大GC領域裏的"小衆"知識。這個在ART一書裏的"14.8 Java Reference對象的處理"一節中有非常詳細的介紹。本文擬簡單說幾句

  • 第十三章"Modularity Design of VM":以Apache Harmony爲例介紹VM的模塊化設計。這一章肯定不如我大ART那本書了,真刀實槍幹源碼還是更直接點。要是沒看過源碼,光看書裏寫得這幾頁能學到什麼? 我打算介紹下ART裏的各個模塊。

ART裏的各種模塊

我把 ART裏(以寫書的7.0爲主)各種比較常見的模塊列了下。 相對來說,這些名字取得還是比較達意的,基本一看就能想到是幹什麼的

但是,你要說這些模塊有沒有“模塊化的設計”?肯定有,也可能沒有。什麼意思呢?

  • 肯定有:ART裏有很多接口類,比如CodeGenerator、Assembler等。都可以通過接口類來解決不同CPU架構上的機器碼生成。這肯定是解耦的,這是很明顯的模塊化的設計。

  • 可能沒有:所謂的抽象也只是行爲的解耦,但數據結構解耦不了。數據結構如果無法解耦,完全意義上的模塊化設計也做不到。說白了,模塊和模塊之間還是耦合很厲害。可惜這本書在第十三章“模塊化設計”裏說的都是行爲上的模塊化。但其實數據結構無法解耦導致了巨大的學習困難。

Soft-Reference對象回收順序的考慮

關於 Reference, 本文 不打算 說太多基礎知識,因爲每個搞Java開發的,都自認爲了解它。 但正如我在 ART一書第14章14.8節 書裏所說 Java Reference 是很多公司面試 Java 開發者 時必問的知識點。 從某種角度來看,這說明大家對 JavaReference 的知識是 即熟悉又陌生。 熟悉它的理由是大部分開發者都能說出幾種 Reference 的差別以及各自適合的使用場景,而對它陌生的原因也很簡單。 畢竟,我們很少有機會能通過虛擬機的源代碼來真正瞭解 Reference 可以這麼說,在沒有看到源代碼之前,我們只是知其然。 看完源代碼後,我們就能做到知其所以然 ”。

相關文章