1. 程式人生 > >深入理解java虛擬機器系列初篇(一):為什麼要學習JVM?

深入理解java虛擬機器系列初篇(一):為什麼要學習JVM?

前言
本來想著關於寫JVM這個專欄,直接寫知識點乾貨的,但是想著還是有必要開篇講一下為什麼要學習JVM,這樣的話讓一些學習者心裡有點底的感覺比較好...

原因一:面試

不得不說,隨著網際網路門檻越來越高,JVM知識也是中高階程式設計師階段必問的一個話題!現在不像以前了,以前會點html都好找工作,現在由於學習軟體的人越來越多,而且每年大學生都在畢業(而老一輩的也很少換工作)人只會越來越多,隨便在大街上拉一個頭發茂盛的大叔都可能就是搞軟體的,現在有一股妖風,不管啥公司都慢慢像阿里這樣的大公司靠近,面試不問點jvm、併發、分散式都不好意思(雖然公司可能沒有用到,雖然可能僅僅CURD),老是覺得問問這些顯得逼格高點,不管處於什麼原因很多公司的確都是這樣的!

所以我不得不相信很多人一開始接觸 Java 虛擬機器只是因為面試需要用到,所以硬著頭皮去學。所以很多人對於為什麼要學虛擬機器這個問題,一致的答案皆是:因為面試。

其實學習JVM並不僅僅在於面試,而在於更深入地理解 Java 這門語言,以及為未來排查線上問題打下基礎。其實說白了,還是得先 好(通)好(過)學(面)java(試)....

然而現實就是這樣,畢竟現實源於生活!也正是因為生活學習JVM為了面試的同時也為今後更好的學習java打下了基礎!

原因二:為了深入地理解 Java 這門語言

學習 Java 虛擬機器能深入地理解 Java 這門語言。對於剛剛工作一兩年的朋友來說,各個 API 都沒用熟,自然不會去深入研究 Java 中的各種細節。如果你這輩子只甘心做一個平庸的Java碼農,那麼你完全沒有必要去學習JVM相關的知識。

但對於工作了三年以後的朋友來說,很多時候你要解決一個問題必須深入到位元組碼層次去分析,你才能得到準確的結論,而位元組碼就是虛擬機器的一部分。

深入地理解 Java 這門語言例項:

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

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

以上兩個例子如果你不懂虛擬機器的一些基礎知識,那麼你就很難深入理解一些細節。

不說別的,就光和同事聊天,同事說到什麼新生代老年代問你一個GC日誌排查,你沒有JVM基礎,賊尬,那個時候你就只會喊我C牛B....

原因三:學習虛擬機器是為了今後更好的解決線上排查問題

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

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

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

學習JVM的好處

學習JVM對於一個Java程式設計師的好處大概可以概括為下六點:

1、能夠明白為什麼Java最早期被稱為解釋型語言,而後來為什麼又被大家叫做解釋與編譯並存的語言(瞭解JVM中直譯器以及即時編譯器就可以回答這個問題);
2、你能夠理解動態編譯與靜態編譯的區別,以及動態編譯相對於靜態編譯到底有什麼好處(JVM JIT);
3、能夠利用一些工具,jmap, jvisualvm, jstat, jconsole等工具可以輔助你觀察Java應用在執行時堆的佈局情況,由此你可以通過調整JVM相關引數提高Java應用的效能;
4、可以清楚知道Java程式是如何執行的;
5、可以明白為什麼Java等高階語言具有可移植性強的特性。 其實這個問題相當於“為什麼C/C++程式設計師需要學體系結構與編譯原理?“
6、能夠知道你的頭髮是怎麼沒有的

關於我之後的JVM專欄

其實在開始寫JVM專欄之前就很想寫一個併發程式設計專欄了,想了很久,最後還是決定先寫一個JVM專欄!學習JVM有一個最大的特點就是....學了就忘,嗯哼~

由於虛擬機種類繁多這裡就不一一列舉,最常用的就是Hotspot虛擬機器(翻譯過來就是 熱 地點、斑點,理解為熱點也行)以後該專欄都是以Hotspot虛擬機器為準的文章。

如果想要更深入的理解JVM推薦看周志明老師的《深入理解Java虛擬機器》。實戰型別的,可以看葛一鳴老師的《實戰Java虛擬機器》

為了方便大家學習JVM,不用去網上找相關書籍,博主準備了周志明老師的《深入理解Java虛擬機器》電子書,慢慢啃吧hhhhhhhh...

周志明老師的《深入理解Java虛擬機器》:https://pan.baidu.com/s/1JoNm7LWKJNyF6bGX3j6MuQ
提取碼:i3xz

以下是本JVM專欄的文章:

別翻了,這篇文章絕對讓你深刻理解java類的載入機制【JVM篇二】

儘量抽空更新...

再次提醒:學習JVM有一個最大的特點就是....學了就忘,嗯哼~

最後,歡迎各位關注我的公眾號,一起探討技術,嚮往技術,追求技術...

參考:
《深入理解Java虛擬機器》
https://www.cnblogs.com/chanshuyi/p/jvm_serial_00_why_learn_jvm.h