1. 程式人生 > >JVM規範系列開篇:為什麼要讀JVM規範?

JVM規範系列開篇:為什麼要讀JVM規範?

許多人知道類載入機制、JVM記憶體模型,但他們可能不知道什麼是《Java虛擬機器規範》。對於Java開發來說,《Java虛擬機器規範》才是最為官方、準確的一個文件,瞭解這個規範可以讓我們更深入地理解JVM。我們平常說的JVM其實更多說的是HotSpot(HotSpot是JVM規範的一種實現),但我們常常將HotSpot與JVM等同起來。正因對於JVM規範認識的不足,所以我專門準備一個系列的文章,帶著大家讀一讀JVM規範。

在接下來的一系列文章中,我將帶著大家一個章節一個章節解讀《Java虛擬機器規範》。但也因為個人實力原因,無法做好詳盡的講解。所以本系列文章的寫作風格是導讀。導讀的意思是我帶著你一起讀,遇到一段話,我寫下自己的一些想法,與大家分享。導讀的缺點就是不成體系,跟著章節走,所以讀這個系列的文章不會有深入淺出的感覺。這點大家需要做好心理準備,以免失望。

有時候難免會有紕漏,請大家見諒。也歡迎有興趣的朋友一起勘誤,一起提出不同見解,共同推進JVM學習氛圍。

緒論

開啟《Java虛擬機器規範》目錄,我們可以看到規範分為下面幾個部分:

  • 第1章 引言
  • 第2章 Java虛擬機器結構
  • 第3章 為Java虛擬機器編譯
  • 第4章 Class檔案格式
  • 第5章 載入、連結與初始化
  • 第6章 Java虛擬機器指令集
  • 第7章 操作碼助記符

第1章 引言

從第1章的目錄可以看出,其主要介紹一些歷史以及Java虛擬機器的基礎知識,還有各章節提要,沒有什麼難度。略過。

第2章 Java虛擬機器結構

第2章介紹了Class檔案格式、資料型別、原始型別、引用型別、執行時資料區、棧幀、位元組碼指令等。

在這一部分中,我們比較熟悉的就是執行時資料區了。其實我們習慣性叫Java虛擬機器記憶體模型或記憶體結構,但在JVM規範中是叫做執行時資料區的。此外棧幀也是非常重要的一個部分,與方法的呼叫有關。位元組碼指令則是更加深層次的知識。

此外,資料型別、原始型別、引用型別等也是基礎的知識,但用得相對較少。

第3章 為Java虛擬機器編譯

這一章從名字可以看出,寫的是如何編譯Java檔案的,將Java檔案編譯為位元組碼檔案,最終提供給Java虛擬機器使用。

我們之前提到Java虛擬機器其實就是將位元組碼檔案翻譯成機器碼,所以這裡就是編譯器把Java原始碼編譯成位元組碼。但是到底如何編譯呢?

  • 算數運算要怎麼編譯?
  • 常量池如何編譯?
  • 方法呼叫如何編譯?
  • ……

這一章解決的就是這個問題。

第4章 Class檔案格式

前面提到過JVM的輸入物料是位元組碼檔案,也就是Class檔案,而不是Java檔案。也就是說無論是Java語言,還是php語言,只要你能編譯出位元組碼檔案,那JVM就能夠執行。

那麼我們就知道這個Class檔案必定是有統一格式的。而這一章節說的內容就是Class檔案的格式構成。之前我們寫過一個HelloWorld.java檔案,將其編譯成位元組碼檔案,然後一個位元組一個位元組地分析其內容。要能分析位元組碼檔案的內容,首先就得弄清楚Class檔案的格式。而這一章就是講解位元組碼檔案格式的。

這一章節也是非常重要的。

第5章 載入、連結與初始化

Java虛擬機器規範其實是遞進、非常有節奏的。前面第2章講了JVM的記憶體結構,之後將如何將原始檔(.java)編譯成位元組碼檔案(.class)檔案,之後將了位元組碼檔案的格式。那麼下一步是什麼?

下一步就是把位元組碼檔案載入到記憶體中執行呀!

沒錯,第5章說的就是這個內容。

首先是載入。《Java虛擬機器規範》在這一章中說明了Java虛擬機器將如何啟動、如何建立、載入類。

其次是連結(包括驗證、準備、解析)。首先會驗證,位元組碼檔案載入進來了,那麼就必須要驗證下這個位元組碼檔案是否寫對了,不然隨便寫一個檔案就執行,豈不是亂套了。準備是給變數和物件分配記憶體。校驗完資料格式,那麼就要針對位元組碼內容進行解析了,就是讀懂這些位元組碼資料到底要幹嘛。這個過程包括了:類與介面解析、欄位解析、普通方法解析等等。

之後是初始化。會執行一些初始化的構造方法,用於初始化資料。

最後執行完畢,Java虛擬機器退出。

第6章 Java虛擬機器指令集

指令集,其實就是一系列指令的集合。例如我們需要給一個區域性變數賦予1這個值,即這個動作:int a = 1; 在我們看來,這很簡單,但對於機器來說需要很多個動作。

所以Java虛擬機器指令集就是將這些常用的動作集中起來,定義成一系列指令,方便我麼能使用。

總結

《Java虛擬機器規範》是最官方的標杆,弄懂它之後,你不會再為網上亂七八糟的資料煩惱,因為這裡就是最標準的。但對於初學者來說,看JVM規範實在是枯燥難懂。所以如果你是初學者,看了這個系列的文章覺得很難懂,也不要氣餒,因為著很正常。作者也是經過了三四年的不斷理解和修正,才慢慢弄懂這些東西。

有時候寫這個系列,我也經常質問自己:你自己水平還不夠,如果寫出一些不準確的東西,豈不是誤人子弟。這個想法在我心中存在了許久,總是覺得要到達很高的水平才可以做這麼一件事情。但後來我想:做一件事情,更重要的是你有多想去做,你希望創造價值的信念有多強,而不是你有多強。有些人很強,但他們卻不分享了。而有些人,即使他們理解不是那麼深刻,但他們樂於分享,卻幫助了不少的人。

對於學習者的你們也是如此。學習JVM不是你需要對它的認識和理解有多深,而是你有多想學。來吧,和我一起一起進入JVM的海洋,一起學習吧!

JVM規範系列文章目錄

如果你還沒下載《Java虛擬機器規範》這本書,那麼先點選這裡下載再一塊兒看吧。