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虛擬機規范》這本書,那么先點擊這里下載再一塊兒看吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM