「JVM系列」一步步解析java執行內幕

對于任何一門語言,要想達到精通的水平,研究它的執行原理(或者叫底層機制)不失為一種良好的方式。在本篇文章中,將重點研究java源代碼的執行原理,即從程

序員編寫JAVA源代碼,到最終形成產品,在整個過程中,都經歷了什么?每一步又是怎么執行的?執行原理又是什么?.....

當然,本篇文章的粒度可能稍微側重于宏觀方面,更細粒度的技術分析,需要在接下來的該系列文章中與大家分享....

一 編寫java源程序

java源文件:指存儲java源碼的文件;

當前比較主流的JAVA IDE?

(1)Intellij IDEA(首推薦)

(2)Eclipse

先來看看如下代碼:

//MyTest被public修飾,故存儲該java源碼的文件名為MyTest

public class MyTest {

public static void main(String[] args){

System.out.println("Test Java execute process.");

}

}

//由于MyTest被public修飾了,故Class A不能用public修飾

class A{}

//由于MyTest被public修飾了,故Class B不能用public修飾

class B{}

(1)java源文件名就是該源文件中public類的名稱

(2)一個java源文件可以包含多個類,但只允許一個類為public

二 編譯java源代碼

當java源程序編碼結束后,就需要編譯器編譯,安裝好jdk后,我們打開jdk目錄,有兩個.exe文件,

即javac.exe(編譯源代碼,即.java文件)和java.exe(執行字節碼,即.class文件)

1.切換到MyTest.java文件夾

2.javac.exe編譯MyTest.java

編譯后,發現e:\Blogs 目錄多了以class為后綴的文件:A.class,B.class和MyTest.class

Tip:當javac.exe編譯java源代碼時,java源代碼有幾個類,就會編譯成一個對應的字節碼文件(.class文件),

其中,字節碼文件的文件名就是每個類的類名。需要注意的是,類即使不在源文件中定義,但被源文件引用,

編譯后,也會編程相應的字節碼文件,如類A引用類C,但類C不定義在類A的源文件中,編譯后,類C也被編

譯成對應的字節碼文件C.class

三 執行java源文件

執行java源文件,用java.exe執行即可

到現在,java源程序基本執行結果,并正確打印我們期望的結果,那么,如上的步驟,我們可以總結如下:

如上總結,已經抽象化了在JVM中的執行,接下來,我們將分析,字節碼文件(.calss文件)如何在虛擬機中一步一執行的。

四 JVM如何執行字節碼文件

(一) 裝載字節碼文件

當.java源碼被javac.exe編譯器編譯成.class字節碼文件后,接下來的工作就交給JVM處理,JVM首先通過類加載器(ClassLoader)

將class文件和相關Java API加載裝入JVM,以供JVM后續處理。

在該階段中,涉及到如下一些基本概念和知識。

1.JDK,JRE和JVM關系

(1)JDK(Java Development Kit),Java開發工具包,主要用于開發,在JDK7前,JDK包括JRE

(2)JRE(Java Runtime Environment),Java程序運行的核心環境,包括JVM和一些核心庫

(3)JVM(Java Virtual Machine),VM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬

各種計算機功能來實現的,是JRE核心模塊。

2.JVM

JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機

虛擬機的主要任務是裝載class文件并執行其中的字節碼,不同的Java虛擬機中,執行引擎可能由不同的實現,大致有如下幾種引擎:

一次性解釋字節碼引擎

即時編譯引擎

自適應優化器

關于虛擬機的實現方式,采用軟件方式、硬件方式和軟件硬件結合方式,這個要根據具體廠商而定。

3.什么是ClassLoader

虛擬機的主要任務是裝載class文件并執行其中的字節碼,而class文件是由虛擬機的類加載器(ClassLoader)完成的,在一個Java虛擬機,

有可能存在多個類加載器。

任何java運用程序,可能會使用兩種類加載器,即啟動類加載器(bootstrap)和用戶自定義類加載器。

啟動類加載器是Java虛擬機唯一實現的一部分,它又可分為原始類裝載器,系統類裝載器或默認類裝載器,它的主要作用是從操作系統的

磁盤裝載相應的類,如Java API類等。

用戶自定義裝載類,按照用戶自定義的方式來裝載類。

(二)將字節碼文件存儲在JVM內存區

當JAVA虛擬機運行一個程序時,它需要內存來存儲許多東西,如字節碼,從已裝載的class文件中得到的其他信息,程序創建的對象,傳遞給

方法的參數,返回值,局部變量以及運算的中間結果等,這些相關信息被組織到“運行時數據區”。

根據廠商的不同,在Java虛擬機中,運行時數據區也有所不同,有些運行時數據區由線程共享,有些只能由某個特定線程共享。運行時數據區

大致可分幾個區:方法區,堆區,棧區,PC寄存器區和本地方法棧區。

在該階段中,涉及到如下基本概念和知識。

1.方法區

方法區用來存儲解析被加載的class文件的相關信息。當虛擬裝載一個class文件后,它會從這個class文件包含的二進制數據中解析類型信息,然后將

該相關信息存儲到方法區中。

2.堆

堆是用來存儲相關引用類型的,如new對象。當程序運行時,虛擬機會把所有該程序在運行時創建的對象都放到堆中。

3.PC寄存器

PC寄存器主要用來存儲線程。當新創建一個線程時,該線程都將得到一個自己的PC寄存器(程序計數器)以及一個java棧。

Java虛擬機沒有寄存器,其指令集使用Java棧來存儲中間數據。

4.棧區

棧區主要用來存儲值類型的,如基本數據類型,需要注意的時,String為引用類型,是存在堆中的。Java棧是由許多棧

幀組成的,一個棧幀包含一個Java方法調用的狀態,當線程調用一個方法時,虛擬機壓入一個新的棧幀到該線程的Java棧中

,當該方法返回時,這個棧幀從Java棧中彈出。

(三)執行引擎與運行時數據區交互

運行時數據區為執行引擎提供了執行環境和相關數據,執行引擎通過與運行時數據區交互,從而獲取

執行時需要的相關信息,存儲執行的中間結果等

(四)執行引擎與本地方法接口

當要執行本地方法時,執行引擎將調用本地方法接口來獲取相關OS本地方法,需要注意的是,本地方法與操作系統強耦合的。

(五)JVM在具體操作系統上執行

JVM通過調用本地接口來獲取本地方法,從而實現在具體的平臺上執行,如在Linux系統上執行,在Window系統上

執行和在Unix系統上執行。

五 參考文獻

【01】深入Java虛擬機(原書第2版)(美)Bill Venners 著

【02】Core Java Volume I - Fundamententals(10th Edition) (美) Cay S.Horstmann

【03】Core Java Volume I - Advanced Features(10th Edition) (美) Cay S.Horstmann

寫在最后:

碼字不易看到最后了,那就點個關注唄,只收藏不點關注的都是在耍流氓!

關注并私信我“架構”,免費送一些Java架構資料,先到先得!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370