畢業8年,前5年的職業規劃是做計算廣告,後來感覺計算廣告這一行更注重的是業務而非技術,而自己的性格更適合做技術,所以毅然決然的辭職, 全職1年半時間寫了2本關於Java編譯器與虛擬機器的書,今年年初來到杭州做Java虛擬機器開發相關的工作,也算是順利切入Java虛擬機器這一行了。

差不多從下決心研究Java虛擬機器開始已經過去了3年多的時間,期間還研究了Java前端編譯器,這一塊也花費了我好多精力,著實有些不值,因為Java前端編譯器相對虛擬機器來說並不顯的那麼重要,而且目前也沒有公司有Java前端編譯器的開發需求。不過總歸是有些作用的,一來我把這些知識寫成了一本書《深入解析Java編譯器:原始碼剖析與例項詳解》,賺取了一些稿費;二來我也通過這本書得到了一些面試機會,不過最願意給我提供崗位的就是一些做監控相關的公司,因為Java前端編譯器和位元組碼息息相關,監控會涉及到對位元組碼的插樁,動態類載入等內容。不過實話實說,實際上不如將研究Java前端編譯器的時間拿來學習Java虛擬機器,價值會更大一些。

全職寫完2本書後,我對自己的職業規劃是做一個技術點,也就是專攻Java虛擬機器,並且現在已經切入到這個領域了,算是小有收穫吧。現在研究HotSpot VM原始碼也快有2年了,只能說大體已經有了個清晰點的認識,對一些重要的實現細節還算比較瞭解。記得剛接觸HotSpot VM時,還是通過百度網上各種資料入門的,但這些內容總歸是錯誤不少,或者不成體系,所以我每遇到一些好的內容都會在通過自己的日誌摘錄下來,後面持續對這些日誌進行分類整理,然後加上我的理解後不斷加工,最後內化成自己的東西。日復一日的總結整理後,沉澱了500多篇部落格,然後對這些部落格進行了大概的分類,如下:

其中編號為01到08這些分類下的內容已經整理完成並寫成了書《深入剖析Java虛擬機器:原始碼剖析與例項詳解(基礎卷)》,現在已經能在噹噹和京東上預購。剩下的編號從10到20的相關內容也會整理成書,書名為《深入剖析Java虛擬機器:原始碼剖析與例項詳解(執行時卷)》。

1、為什麼要學習Java虛擬機器?

為什麼要學習Java虛擬機器?簡單來說,學習 Java 虛擬機器可以讓你知道Java 程式是如何被執行的,又如何被優化的。只有知道程式如何被執行和被優化才能編寫出更高效的程式碼。總結一下, 學習Java 虛擬機器有如下(但不限於)好處

(1)學習Java虛擬機器讓你更深入的瞭解虛擬機器之上的語言的執行原理,如Scala、Java、Kotlin等。這樣可以在面試的過程中增加不少自信,也會提高面試成功的概率;

(2)學習Java虛擬機器可以讓你更好的使用它。如Java 虛擬機器提供了許多配置引數,我們可以針對不同的應用配置不同的引數來讓程式的效能達到最優;

(3)Java 虛擬機器本身是一種工程產品,實際的程式碼實現過程要比單純的理論看著更復雜,需要考慮的情況更加複雜而全面,這反而能讓我們對理論有個更深刻的理解,同時也能感受一下超大型專案的架構和設計理念;

(4)學習虛擬機器可以更快、更準確的排查線上排查。假設線上遇到了服務超時的情況,我們排查後發現有FGC的發生,那麼怎麼去更準確的定位這個問題?首先,必須要看懂日誌,要看懂日誌,就要對Java虛擬機器年輕代、老年代、永久代、元資料區等內容有所瞭解;其次還要知道各種GC演算法的實現原理,瞭解他們的優缺點等,這些都是虛擬機器實現的一部分。

對於我本人來說,我喜歡研究底層技術,之前在做Java應用開發的時候,總感覺Java虛擬機器對我來說是個黑盒,我有強烈的慾望看看它是怎麼實現的,同時也是想做一些看起來有逼格的事情,有技術門檻的事情,避免35歲中年危機。

2、如何快速切入Java虛擬機器領域?

我記得2年前開始研究Java虛擬機器時,查遍了網上所有的資料,凡是能遇到一點好的關於Java虛擬機器的資料,我都會認真讀、一遍讀不懂沒關係,我都會搬到自己的日誌中記錄下來,後面就是對這些日誌進行分類整理,然後加上我的理解後不斷加工,最後內化成自己的東西。現在市面上系統介紹Java虛擬機器的書籍非常少,細緻全面的書籍更是市場空白,所以我把我這幾年的所學寫成了3本書,希望能更快幫助大家理解Java虛擬機器。大家如果想要快速切入Java虛擬機器領域,可以參考我的書籍《深入解析Java編譯器:原始碼剖析與例項詳解》和《深入剖析Java虛擬機器:原始碼剖析與例項詳解(基礎卷)》,《深入剖析Java虛擬機器:原始碼剖析與例項詳解(執行時卷)》一書暫時還沒有上市,不過執行時卷的相關內容已經在我的公眾號“深入剖析Java虛擬機器HotSpot”開始持續更新。

如果大家有興趣學習Java虛擬機器,可以按照如下的學習路線圖來參考我對應的書籍。

左側是Java底層的一些東西,而右側的書籍詳細介紹了左側對應的內容,大家如果有興趣可以買來閱讀一下。

《深入解析Java編譯器:原始碼剖析與例項詳解》購買地址:https://item.jd.com/12794094.html

《深入剖析Java虛擬機器:原始碼剖析與例項詳解(基礎卷)》預購地址:https://item.jd.com/12926187.html

《深入剖析Java虛擬機器:原始碼剖析與例項詳解(執行時卷)》 相關內容在公眾號 ”深入剖析Java虛擬機器HotSpot“ 開始持續更新,公眾號目前更新到了第8篇,如下:

有興趣可以關注我的公眾號。

3、給想學習Java虛擬機器的人的一些建議

首先要弄清楚自己學習Java虛擬機器的目地。比如有的人只是為了排查線上問題、有的人可能為了面試、有的人想從事與虛擬機器相關的工作。不同的目的需要對虛擬機器的理解程度不同。如果是排查線上問題,那就專注於和這個問題相關的Java虛擬機器實現即可。

其次就是在學習的過程中,不要抱有速成的心態,這是好多人開始研究時的一種心態,就想著自己閉關3個月、5個月的下決心把它研究個透徹,這幾乎是不可能的,除非你對虛擬機器涉及到的一些技術有非常好的基礎,否則3、5個月很難玩明白虛擬機器。拿我來說,只有Java基礎,有一些C的基礎,其它就都沒有了,我在研究虛擬機器之前補了很多的基礎知識,看了很多的書,比如C++、Linux系統程式設計、垃圾回收演算法手冊、x86組合語言、甚至是Intel的CPU機器指令手冊這些東西,另外還要加上相關的論文。所以說,如果你基礎差一些,光補基礎就不是3個月、5個月能完成的,我們還是要準備好5年、10年的學習打算吧。

之前也是遇到很多人問我是怎麼研究HotSpot VM的?我採取的是笨辦法,硬著頭皮去啃,這個東西感覺沒有太多捷徑,但沒有捷徑並不意味著在學習的過程中沒有技巧和學習方法。HotSpot VM差不多有60萬行左右的程式碼,但是我們並不需要研究每一行的實現,而且有些知識點能夠觸類旁通,下面我總結了一些我的研究心得:

(1)只專注與Intel CPU下x86架構的、在Linux平臺上的實現,其它架構和平臺下的程式碼實現不去研究,我甚至把那些不需要研究的程式碼都刪除了,為了讓程式碼少一些,在研究的過程中能更好定位一些,少一些的程式碼也讓我心理不那麼悚;

(2)有些東西觸類旁通,例如研究通了序列收集器,那麼GC標記邏輯、代際引用、以及年輕代的垃圾收集演算法、物件偏移表、卡表等在後續研究CMS、G1等垃圾收集器時會有相當大的幫助。所以我們在研究同類的東西時,一定要專注於把涉及到的知識點徹底弄懂;

(3)前期不要過分糾結細節,否則會陷進細節的汪洋大海中,耗費精力不說,也容易打擊自信心。所以要在掌握原理的基礎上,對重點程式碼的實現進行剖析即可;

(4)在研究某段程式碼之前最好知道這段程式碼的作用,可以閱讀註釋、請教別人,這樣能更快的理解程式碼的實現細節。例如要閱讀一下解釋執行相關的程式碼,那最起碼需要閱讀一下相關的論文和書籍關於解釋執行的介紹,知道解釋執行的基本實現原理;

(5)學習過程中要不斷總結,一定要有產出。我會記錄自己研究Java虛擬機器某個知識點的詳細過程,把不明白的記下來,標紅。古人說的好,好記心不如爛筆頭。好多東西在開始學習的時候可能只能懂的一些皮毛,我們只能Get到一些零散的知識點,後續還要3遍、5遍的去研究。對於我來說,每次研究都會有新的收穫,而且如果解決了上次標紅的問題,對我來說還有種小小的成就感。

現在各個行業內卷嚴重,但我拒絕躺平,如果有志,大家一起研究Java虛擬機器,我拉你入討論組,我的微訊號mazhimazh。