天天看點

為什麼我們要學習Java虛拟機

前不久我參加了一個國外程式員的講座,講座的副标題很有趣,叫做:“我如何學會停止恐懼,并且愛上 Java 虛拟機”。

這句話來自一部黑色幽默電影《奇愛博士》,電影描述了冷戰時期劍拔弩張的氛圍。

程式員之間的語言之争又未嘗不是如此。寫系統語言的鄙視托管語言低下的執行效率;寫托管語言的則取笑系統語言需要手動管理記憶體;寫動态語言的不屑于靜态語言那備援的類型系統;寫靜态語言的則嘲諷動态語言裡面各種光怪陸離的運作時錯誤。

Java 作為應用最廣的語言,自然吸引了不少的攻擊,而身為 Java 程式員的你,或許在口水戰中落了下風,忿忿于沒有足夠的知識武裝自己;又或許想要深入學習 Java 語言,卻又無從下手。甚至是在實踐中被 Java 的啟動性能、記憶體耗費所震驚,是以對 Java 語言本身産生了種種的懷疑與顧慮。

别擔心,我就是來解答你對 Java 的種種疑慮的。“知其然”也要“知其是以然”,學習 Java 虛拟機的本質,更多是了解 Java 程式是如何被執行且優化的。這樣一來,你才可以從内部入手,達到高效程式設計的目的。與此同時,你也可以為學習更深層級、更為核心的 Java 技術打好基礎。

我相信在不少程式員的觀念裡,Java 虛拟機是透明的。在大家看來,我們僅需知道 Java 核心類庫,以及第三方類庫裡 API 的用法,便可以專注于實作具體業務,并且依賴 Java 虛拟機自動執行乃至優化我們的應用程式。那麼,我們還需要了解 Java 虛拟機嗎?

我認為是非常有必要的。如果我們把核心類庫的 API 比做數學公式的話,那麼 Java 虛拟機的知識就好比公式的推導過程。掌握數學公式固然可以應付考試,但是了解背後的推導過程更加有助于記憶和了解。并且,在遇到那些沒法套公式的情況下,我們也能知道如何解決。

具體來說,了解 Java 虛拟機有如下(但不限于)好處。

首先,Java 虛拟機提供了許多配置參數,用于滿足不同應用場景下,對程式性能的需求。學習 Java 虛拟機,你可以針對自己的應用,最優化比對運作參數。(你可以用下面這個例子看一下自己虛拟機的參數清單。)

舉例來說,macOS 上的 Java 10 共有近千個配置參數:

其次,Java 虛拟機本身是一種工程産品,在實作過程中自然存在不少局限性。學習 Java 虛拟機,可以更好地規避它在使用中的 Bug,也可以更快地識别出 Java 虛拟機中的錯誤,

再次,Java 虛拟機擁有目前最前沿、最成熟的垃圾回收算法實作,以及即時編譯器實作。學習 Java 虛拟機,我們可以了解背後的設計決策,今後再遇到其他代碼托管技術也能觸類旁通。

最後,Java 虛拟機發展到了今天,已經脫離 Java 語言,形成了一套相對獨立的、高性能的執行方案。除了 Java 外,Scala、Clojure、Groovy,以及時下熱門的 Kotlin,這些語言都可以運作在 Java 虛拟機之上。學習 Java 虛拟機,便可以了解這些語言的通用機制,甚至于讓這些語言共享生态系統。

說起寫作這個專欄的初心,與我個人的經曆是分不開的,我現在是甲骨文實驗室的進階研究員,工作主要是負責研究如何通過程式分析技術以及動态編譯技術讓程式語言跑得更快。明面上,我是 Graal 編譯器的核心開發者之一,在為 HotSpot 虛拟機項目擰螺絲。

這裡順便說明一下,Graal 編譯器是 Java 10 正式引入的實驗性即時編譯器,在國内同行口中被戲稱為“甲骨文黑科技”。當然,在我看來,我們的工作同樣也是分析應用程式的性能瓶頸,尋找優化空間,隻不過我們的優化方式對自動化、通用性有更高的要求。

加入甲骨文之前,我在瑞士盧加諾大學攻讀博士學位,研究如何更加精準地監控 Java 程式,以便做出更具針對性的優化。這些研究工作均已發表在程式語言方向的頂級會議上,并獲得了不少同行的認可(OOPSLA 2015 最佳論文獎)。

在這 7 年的學習工作生涯中,我拜讀過許多大神關于 Java 虛拟機的技術部落格。在受益匪淺的同時,我發覺不少文章的門檻都比較高,而且過分注重實作細節,這并不是大多數的開發人員可以受益的調優方案。這麼一來,許多原本對 Java 虛拟機感興趣的同學, 也因為過高的門檻,以及短時間内看不到的收益,而放棄了對 Java 虛拟機的學習。

在收到極客時間的邀請後,我決定也挑戰一下 Java 虛拟機的科普工作。和其他欄目一樣,我會用簡單通俗的語言,來介紹 Java 虛拟機的實作。具體到每篇文章,我将采用一個貫穿全文的案例來闡述知識點,并且給出相應的調優建議。在文章的末尾,我還将附上一個動手實踐的環節,幫助你鞏固對知識點的了解。

整個專欄将分為四大子產品。

基本原理:剖析 Java 虛拟機的運作機制,逐一介紹 Java 虛拟機的設計決策以及工程實作;

高效實作:探索 Java 編譯器,以及内嵌于 Java 虛拟機中的即時編譯器,幫助你更好地了解 Java 語言特性,繼而寫出簡潔高效的代碼;

代碼優化:介紹如何利用工具定位并解決代碼中的問題,以及在已有工具不适用的情況下,如何打造專屬輪子;

虛拟機黑科技:介紹甲骨文實驗室近年來的前沿工作之一 GraalVM。包括如何在 JVM 上高效運作其他語言;如何混搭這些語言,實作 Polyglot;如何将這些語言事前編譯(Ahead-Of-Time,AOT)成機器指令,單獨運作甚至嵌入至資料庫中運作。