1. 程式人生 > >JVM系列開篇:為什麼要學虛擬機器?

JVM系列開篇:為什麼要學虛擬機器?

跟許多人一樣,我一開始接觸 Java 虛擬機器只是因為面試需要用到,所以硬著頭皮看看。所以很多人對於為什麼要學虛擬機器這個問題,他們的答案都是:因為面試。但我經過了幾年的學習和實戰,我發現其實學習虛擬機器並不僅僅在於面試,而在於更深入地理解 Java 這門語言,以及為未來排查線上問題打下基礎。

先聊聊我的第一個觀點:學習 Java 虛擬機器能深入地理解 Java 這門語言。對於剛剛工作一兩年的朋友來說,各個 API 都沒用熟,自然不會去深入研究 Java 中的各種細節。但對於工作了三年以後的朋友來說,很多時候你要解決一個問題必須深入到位元組碼層次去分析,你才能得到準確的結論,而位元組碼就是虛擬機器的一部分。

例如我們常用的布林型 Boolean,我們都知道它有兩個值,true 和 false。但你們知道其實在執行時,Java 虛擬機器是沒有布林型 Boolean 這種型別的。Boolean 型在虛擬機器中使用整型的 1 和 0 表示。

例如我們都知道類路徑和類名唯一確定一個類,但事實上並不是這樣。或者說,我們前面說的結論只是表面上的。如果深入到虛擬機器層面來說,類載入器、類路徑、類名才唯一決定一個類。也就是說,如果兩個不同的類載入器它們載入同一個 class 類檔案,那這兩個類載入器載入的類就是不同的。

類似這樣的例子還有很多。學 Java 學到了這個程度,如果你不懂虛擬機器的一些基礎知識,那麼你就很難深入理解一些細節。

接著我想聊聊我的第二個觀點:學習虛擬機器是為線上排查問題打下基礎。我們知道我們一個 Java 應用部署在線上機器上,肯定時不時會出現問題。除去網路、系統本身問題,很多時候 Java 應用出現問題,就是 Java 虛擬機器的記憶體出現了問題。要麼是記憶體溢位了,要麼是 GC 頻繁導致響應慢等等。

那如何解決這些問題呢?首先,你必須學會看懂日誌吧。那麼你就必須要看得懂 GC 日誌,這是 Java 虛擬機器內容的一部分。你看懂了 GC 日誌,那麼你就得明白什麼是年輕代、老年代、永久代、元資料區等,這些就是 Java 虛擬機器的記憶體模型。你懂了 Java 虛擬機器的記憶體模型,那你就得知道 Java 虛擬機器是如何進行垃圾回收的,它們使用的垃圾回收演算法是怎樣的,它們有何優缺點。接下來就是各種垃圾回收器的特性。

你看,這一切東西都是相關聯的。你想要解決線上的 Java 應用崩潰問題,那麼你就必須學會 GC 日誌。要看懂 GC 日誌,就必須學習 Java 虛擬機器記憶體模型。要看懂 Java 虛擬機器記憶體模型,你就要學會垃圾回收機制等等。

說完了為什麼要學虛擬機器,接下來我想說一下我為什麼要寫這個專欄。

或許在別人看來,市面上的虛擬機器資料已經非常豐富了。理論型別的,可以看周志明老師的《深入理解Java虛擬機器》。實戰型別的,可以看葛一鳴老師的《實戰Java虛擬機器》。我似乎沒有理由再去寫同樣的內容,寫了也會有大部分內容的重合。一開始我也是這麼想,但後來我發現在某些知識點的理解上,我有我自己的理解,我希望與大家分享。雖然不可避免會有一些重疊的地方,但寫作思路不一樣,針對的人群不一樣,意義自然也就不一樣了。

比起《深入理解Java虛擬機器》和《實戰Java虛擬機器》,我寫得應該更淺顯一些,更容易看得懂一些。這個專欄會以一條邏輯線索方式去寫,即以原始碼、位元組碼、機器碼、載入到記憶體、垃圾回收這個視角去寫,聊聊這中間所涉及到的所有知識點。這種方式相對來說更有邏輯性,更能把所有知識點都串聯起來。希望以一種有邏輯的方式去將所有知識點串起來,讓大家更好理解,能讓初學者不僅知道這個東西,還知道為什麼要這麼做。

確定想做這件事情之後,我 2 個月前開始準備,每天早上 6 點起床看相關書籍,開始著手寫初稿。但要寫好一個深入淺出的專欄真的不容易,有時候要求太高反而容易讓文章難產而死。在我寫下這篇文章之時,我大致已經理清楚要寫的文章章節,但是內容還是無法非常明確。但我知道,如果我再不發出來,或許就再也不會發出來了。因為寫得時間太久了,太拖下去或許就寫不完了。有時候太追求完美,反而不是一件好事。所以大家在看的時候歡迎多提提意見,幫助我完善文章。

如果你對我說的感興趣,那可以關注一下我後續發的文章。如果你有朋友也對 Java 虛擬機器感興趣,也可以轉發給他們,邀請他們一起拉學習。

本文完。


未來一段時間裡,我都專注於 Java 虛擬機器方面的專題學習。於是我建了一個交流群,專門討論學習 Java 虛擬機器方面的內容,每週討論一個知識點。如果你有興趣,可以關注「Java技術精選」公眾號,通過右下角選單「入群交流」加我好友,之後回覆「虛擬機器交流」入群