跟許多人一樣,我一開始接觸 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 虛擬機方面的內容,每周討論一個知識點。如果你有興趣,可以關注「陳樹義」公眾號,通過右下角菜單「入群交流」加我好友,之后回復「虛擬機交流」入群。
JVM基礎系列文章目錄
- JVM基礎系列開篇:為什么要學虛擬機?
- JVM基礎系列第1講:Java 語言的前世今生
- JVM基礎系列第2講:Java 虛擬機的歷史
- JVM基礎系列第3講:到底什么是虛擬機?
- JVM基礎系列第4講:從源代碼到機器碼,發生了什么?
- JVM基礎系列第5講:字節碼文件結構
- JVM基礎系列第6講:Java虛擬機內存結構
- JVM基礎系列第7講:JVM類加載機制
- JVM基礎系列第8講:JVM 垃圾回收機制
- JVM基礎系列第9講:JVM垃圾回收器
- JVM基礎系列第10講:垃圾回收的幾種類型
- JVM基礎系列第11講:JVM參數之堆棧空間配置
- JVM基礎系列第12講:JVM參數之查看JVM參數
- JVM基礎系列第13講:JVM參數之追蹤類信息
- JVM基礎系列第14講:JVM參數之GC日志配置
- JVM基礎系列第15講:JDK性能監控命令