JVM(一)史上最佳入門指南

王磊的部落格發表於2019-01-06

提到Java虛擬機器(JVM),可能大部分人的第一印象是“難”,但當讓我們真正走入“JVM世界”的時候,會發現其實問題並不像我們想象中的那麼複雜。唯一真正令我們恐懼的,其實是恐懼本身。而作為整個JVM系列的首篇,本文將帶你解除剛開始學習JVM時的種種疑惑。比如:什麼是JVM?為什麼學習JVM?怎麼有效的學習JVM?帶著以上的這些問題,讓我們一起走入JVM的世界吧。

一、什麼是JVM?

JVM簡介: JVM是Java Virtual Machine的縮寫,中文翻譯為Java虛擬機器,是一種用於計算裝置的規範,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。簡單來說JVM是用來解析和執行Java程式的。

Java有一個非常重要的特點“平臺的無關性”,就是使用JVM實現的。Java語言只需要生成Jvm上執行的目的碼(位元組碼),就可以在多種平臺上不加修改地執行,因為JVM本身遮蔽了與具體平臺相關的資訊,使得Java能夠“一次編譯,到處執行”。

二、為什麼要學習JVM?

學習JVM無外乎以下幾個原因:

1、 程式調優

不同的程式(業務場景)需要不同的Jvm配置,比如設定不同的垃圾收集器、設定新生代和老生帶的記憶體配置和佔比等,不同的配置對於程式的執行有著千差萬別的影響。而Jvm預設的配置只能保證程式能夠“執行”,而想要“很好的執行”甚至是“更好的執行”,就是學習Jvm最主要的因素之一。

2、 排查程式執行問題

有些程式可能線上上使用的時候會遇到各種各樣的問題,而這些問題通常都是致命的,比如記憶體溢位,死鎖導致的程式執行緩慢等,而這些問題在開發和小量併發測試階段是很容易被忽略的缺陷,所以學習好了Jvm才能在關鍵的時候,臨危不亂幫你掃除系統中的“頑疾”。

3、 掌握了程式執行的根本和原理

也就是很多人說的:不但要“知其然”,還要“知其所以然”。

4、 規避寫程式碼時候的一些錯誤

比如避免過載可變長引數的呼叫(後面文章會給出具體的案例)。

5、 應付面試

不得不說這也是很多人學習的目的之一,當然這也是積極的推動力,如果你明白“鯰魚效應”的話。

6、 掌握了其他語言的通用機制

JVM還有一個強大之處是,它不止可以執行Java程式,還可以執行Scala、Clojure、Groovy,以及時下熱門的 Kotlin,學習JVM便可以瞭解這些語言的通用機制,甚至於讓這些語言共享生態系統。

三、怎麼有效的學習JVM?

以上了解了學習JVM的種種好處,但是怎麼有效的學習JVM呢?有人可能一看到“JVM”或者“Java虛擬機器”這幾個字就懵了,不知道它是啥,更別說要怎麼學了。而本小節就是要教大家怎麼有效的學JVM,把JVM做一個知識點的劃分。可以說,掌握了以下列舉的知識點,就是掌握了整個JVM。

JVM的知識點,分為如下幾個:

1、 JVM的組成

只有瞭解了JVM的組成部分,才能算的上真正的瞭解了JVM,JVM的組成5個部分:堆、虛擬機器棧、本地方法棧、程式計數器、方法區,後面文章會分別介紹5個部分的具體用途。

2、 多種垃圾回收演算法

Jvm中有很多垃圾回收演算法,不同的演算法優缺點也各不相同,比如:標記清除演算法和複製演算法、標記清楚演算法會產生多種空間碎片、複製演算法把記憶體分為兩塊,效能雖然很好但是每次只能使用一塊,又浪費了記憶體的空間,那有沒有相對完美的演算法呢?答案肯定是有的,由於篇幅的原因,後面文章會詳細講解。

3、 多種垃圾收集器

Jvm的垃圾收集器有很多,比如最早版本的序列收集器Serial,發展歷史最悠久的收集器,它是採用複製演算法的新生代收集器,它是一個單執行緒收集器,它在進行垃圾收集時,必須暫停其他所有的工作執行緒,直至Serial收集器收集結束為止(“Stop The World”)。還有CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器;還有比較前沿的G1(Garbage-First)收集器等。

學習這些收集器,一方面是為自己程式配置合適的收集器,另一方面是每個收集器的設定引數都不相同,學習了這些收集器的配置之後,可以為程式設定最優的執行匹配引數。

4、 JVM分析工具

Jvm的分析工具用於排查程式執行的缺陷,找出程式的問題所在,從而保證程式的穩定執行,Jvm分析器分為:命令列工具(官方稱之為實驗性質的工具,但穩定性是不容置疑的),還有檢視分析工具,前者當然優於後者,但後者是建立在前者的基礎上的,本系列後面會詳細的把每個工具進行深入的講解。

5、 Java類載入機制

Java類載入機制,講的是Java的類在Jvm中的載入以及執行機制,對於認識Java是怎麼執行的有著非常大的幫助,這也是學習Java非常有趣的一點,你可以看到Java執行的整個過程,是完全透明化的,給人一種“掌控感”,這是Java語言天生支援的,所以會覺得Java這門語言很有趣。

6、JVM常用優化配置

學習Jvm收益最大的其實就是,使用Jvm的這些常用配置,讓你的程式執行的更高效,所以對於這方面的學習是必不可少的。

四、總結

本文帶領大家對Jvm整體的印象有了初步的認識,我們明白了Jvm的學習能帶給我們的收益,以及Jvm該如何學習,而這些問題恰好是剛開始學習Jvm時最大的障礙。萬事開頭難,好的開始是成功的一半,恭喜你學習了Java領域中一項不可或缺的技能,如果覺得本文不錯,歡迎轉發到朋友圈或分享給你的朋友。

此篇是Jvm系列的第一篇,關注作者公眾號,瞭解後續更多精彩內容:

JVM(一)史上最佳入門指南