寫給Java程式設計師的Java虛擬機器學習指南

weixin_33763244發表於2019-03-14

大家好,我是極客時間《深入拆解Java虛擬機器》作者、Oracle Labs高階研究員鄭雨迪。有幸借這個專題的機會,能和大家分享為何Java工程師要學Java虛擬機器?如何掌握Java虛擬機器?

工欲善其事,必先利其器

“為什麼學Java虛擬機器”這個問題,就和“為什麼要學習資料結構和演算法”是一個道理:工欲善其事,必先利其器。

我總結了三點必須要學好Java虛擬機器的理由:

  • Java已然是一門主流的工程語言,擁有大量的應用。作為Java語言的執行引擎,Java虛擬機器的調優一直是熱點話題,成為各大廠面試的壓軸題。
  • 此外,主流的Java虛擬機器–也就是OpenJDK的HotSpot VM–是完全開源的。只要讀得懂C++程式碼,便能夠繞開網路上的“二手”資料,直面Java實現的核心邏輯。
  • Java在不斷地增添新特性、新功能,其中不少都“借鑑”自其他程式語言。同樣,通過學習Java虛擬機器,在遇到其他語言實現時也能夠觸類旁通,迅速地完成調優、排錯工作。

另外,我注意到國內大廠不再只滿足於使用開源專案,而是積極參與這些專案的開發。例如Alibaba在去年便已成為OpenJDK專案執行委員會的一員,可以左右Java語言的發展。一旦越來越多的大廠加大對底層、對這些開源專案的投入,勢必會產生許多對高精尖技術專家的需求。

所以,作為一名Java程式設計師,在盡情享受Java虛擬機器帶來好處的同時,你還應該去了解和思考“這些技術特性是如何實現的”,去了解最底層的原理。只有熟悉JVM,你才能在遇到OutOfMemory等異常時,不會束手無策,不會一臉懵逼的上網找解決辦法,最後就算改了幾個啟動引數解決了問題,也還是雲裡霧裡。

那該如何揭開Java虛擬機器迷霧,深入底層,將Java虛擬機器拿下?我分為3個階段來分享,每個階段大家又該具備哪些技能?

先附上一張我製作的「Java虛擬機器知識框架圖」,涵蓋了Java虛擬機器的所有學習要點,建議儲存。
\"\"

一、Java虛擬機器新手入門

雖然我們和語言朝夕相處,但不少人提及程式碼的詳細執行過程也難免會一時語塞。這都是由於Java虛擬機器封裝得太好,讓使用者幾乎感覺不到它的存在,也導致不少初學者學習Java虛擬機器時摸不著頭腦,找不到脈絡。

Java虛擬機器的基本原理及執行機制,對於初學者來說,是必須要掌握的,至少我是這麼要求的。不然根基不牢,何來平地高樓起。

所以我也花了一整個模組的篇幅來逐次介紹Java虛擬機器的設計決策以及工程實現,讓大家在學習Java虛擬機器時,可以知其然,也要知其所以然。

以下是專欄裡的部分原理內容,大家對照著,看看是否已掌握。

Java程式碼有很多種執行方式,那Java 虛擬機器具體是怎樣執行 Java 位元組碼的?[第1講 | Java程式碼是怎麼執行的?]
boolean在Java虛擬機器是以整數形式表示的–0代表false,1代表true。那麼2又代表什麼呢?為什麼要這樣設計?[第2講 | Java的基本型別]

二、進階Java虛擬機器

告別了GRUD研究員,如果你想再進一步進階,那麼以下是知識點是你必須要掌握的。弄懂了這些,你基本上掌握了面試官80%的問題。

怎麼判定物件已經“死去”?垃圾回收的原理是什麼? [第11講 | 垃圾回收(上)]
Java虛擬機器的堆是如何劃分的? [第12講 | 垃圾回收(下)]

當然,我希望大家能系統學習Java虛擬機器,而不是為了面試去刷題。更要的是希望這個專欄能激發出大家學習Java虛擬機器乃至其他底層工作、前沿工作的熱情。

就像我開設這個專欄一樣,為不辜負大家的信任,我幾乎每篇專欄都會大量閱讀HotSpot的原始碼,和同事討論實現背後的設計理念,在這個過程中,我也發現了一些HotSpot中的Bug,或者年久失修的程式碼,又或者是設計不合理的地方。苦中有樂,忙碌中又有驚喜。

三、Java虛擬機器高手

在我的專欄中,有一條令我印象頗深的留言,講的是他如何解決反射呼叫效率低下的問題。之所以印象深刻,是因為他的做法和Java虛擬機器中附帶的自動優化方式完全一致。換個角度來看,他其實已經具備為Java虛擬機器設計優化的能力,也完全可以將這一優化實現回饋給OpenJDK社群。

舉一反三,主動的解決問題,且能回饋開源。這必然是高手需要具備的能力之一。

這時候大家必須去想的一個問題:如何讓Java(以及其他Java虛擬機器語言,如Scala、Kotlin等)跑得更快?

主要分三個方面去考慮:

什麼是虛方法呼叫?如何消除虛方法呼叫開銷?[第20講 | 方法內聯]
Java虛擬機器是如何進行硬體加速的?[第22講 | HotSpot虛擬機器的intrinsic]
我需要手工避免new語句嗎?[第23講 | 逃逸分析]

再之,Java虛擬機器有很多工具,需要大家熟練掌握,比如javap–能夠將class檔案反彙編人類可讀格式的工具;OpenJDK專案Code Tools–包含了好幾個實用小工具,又或者是ASM–Java 位元組碼框架等等。

在專欄裡,我專門有幾篇文章來介紹各類工具的使用:

如何通過註解處理器自動生成業務邏輯? [第27講 | 註解處理器]
如何標準化地衡量程式效能? [第28講 | 基準測試框架]

作者介紹

鄭雨迪,甲骨文實驗室(Oracle Labs)的高階研究員,主要負責研究如何通過程式分析技術以及動態編譯技術讓程式語言跑得更快。同時,也是全棧虛擬機器Graal編譯器的核心開發者之一,在為HotSpot虛擬機器專案添磚加瓦。

通過學習《深入拆解Java虛擬機器》,你將獲得:

  • Java工程師進階加薪必修課
  • 4大模組全方位拆解JVM
  • 幫助你編寫高效Java程式碼
  • 揭祕Oracle最新的Java黑科技

戳此訂閱:《深入拆解Java虛擬機器》這個專欄漲價倒數計時最後5天,從 68元直接漲到 99元,現參團只要 58元。

相關文章