通俗易懂帶你瞭解 JVM體系結構——再也不怕面試官問了!!!

JVM的體系結構概述

一、JVM位置

因爲 JVM 的體系結構其實與 JVM 所在位置有一定關係,所以我們要知道 JVM 的位置。

硬件之上是操作系統,操作系統之上纔是 JVM ,所以JVM 與硬件沒有直接的交互。

二、JVM 的體系結構有哪些部分

我們先來粗略的說一下一個程序從編寫到執行的過程。
當我們編寫了一個 Java 程序,也就是一個以 .java 爲後綴的源文件,比如 HelloWorld.java 。 我們去點擊編譯運行 ,其中,編譯是通過編譯器將 .java 源代碼文件 編譯成 .class 二進制字節碼文件,然後這個 .class 文件會被加載進一個運行時的區域,再通過一個執行引擎解釋 .class 中的命令,最後交由給操作系統執行。

通過上面這個流程,我們大概知道了,JVM 的體系結構中需要有一個類加載器,然後還需要一個運行時的區域,並且還需要一個執行引擎

通過分析之後,初步得到結構圖:

但這只是初步分析之後得到的結構圖,肯定還有些不完善的地方,我們接着來分析並完善。

我們知道,Java 不能直接操作硬件系統,而 C/C++ 等一些語言可以操作硬件系統,而如果我們的程序中需要操作硬件系統,那我們就需要調用 C/C++ 程序來操作。而不同語言間的調用,一般是使用提供好的接口,通過這些接口去調用其他語言的方法庫。在Java中,將這些 C/C++ 程序的方法,稱爲本地方法。

那麼我們知道,我們的 JVM 體系結構中,還需要可以通過 本地方法接口 從而去調用本地方法庫中的方法。

進一步分析後的結構圖:

恭喜!通過我們一步步的分析,JVM 體系結構的整體結構就分析出來了。

下一步,我們再來深入思考分析來細化一下結構圖。

從上面的分析和得出的結構圖中,我們可以知道類加載器會把 .class 加載進運行時數據區,然後再由執行引擎解釋其中的命令並交由操作系統執行。那麼思考一下,這個運行時數據區需要什麼東西?

  1. 首先,當一個虛擬機啓動時,我們內存區域中肯定要準備一塊地方來存放對象實列,而不同的線程都需要去創建對象實例,並且可能需要操作其他線程創建的實列,所以這個內存區域需要是線程共享的。這個區域我們可以稱之爲
    所以,我們的 JVM 體系結構中還需要一個線程共享的

  2. 有了內存區域存儲對象實列,那麼類的結構信息,常量,靜態變量,等一些其他信息,我們是不是也應該有一個內存區域來存放?並且,對於,類的結構信息,常量,靜態變量 等這些信息,多個線程肯定都是需要用到的,但如果單獨給每個線程都準備這麼一個內存區域來存放這些信息的話,那就太浪費了。因爲這些信息,不管哪個線程來訪問都是一樣的,那麼這個內存區域應該設置成線程共享的。這個區域,我們可以稱爲方法區
    所以,我們的JVM 體系結構中還需要一個線程共享的 方法區

  3. 我們一個 Java 程序裏面可能有很多語句,也就是有很多指令(指令),這些語句由執行引擎去讀取解釋並交由操作系統運行,那麼執行引擎怎麼知道該讀取那一條指令呢?執行引擎只負責讀取並解釋命令,並不知道該讀取哪一條指令。所以我們要將該執行的指令告訴執行引擎
    而有一個東西叫做PC寄存器,或者叫做程序計數器,它可以用來記錄當前線程所執行的字節碼的行號。然後通過這個程序計數器執行引擎就知道該執行哪條指令了。
    所以,我們的 JVM 體系結構中還需要一個程序計數器

  4. 一個 Java 程序運行之後,可以有多個線程,而 Java 程序中的某個方法被某個線程調用直至執行完畢這個過程,會有專屬於這個過程的局部變量表,操作數幀,動態連接,方法出口,等這些信息。而這些信息,我們需要用一個東西來存儲,並且這個東西需要是線程私有的。 這個東西就叫做 Java棧(也稱爲 Java虛擬機棧),在這這個Java虛擬機棧中,會用一個個棧幀,來存儲一個個方法被調用到執行完畢過程中的一些信息;並且一個棧幀出入虛擬機棧的過程,對應着一個方法被調用到執行完畢的過程。(更加具體的內容暫時不需瞭解,這一篇主要是用來了解 JVM 的體系結構。)
    綜上可知,我們的 JVM 體系結構中還需要一個 Java 虛擬機棧

  5. 因爲一些歷史原因(有興趣的可以去了解一下),Java 不得不在內存區域中劃分出一塊區域專門來存儲一個個本地方法被調用到執行完畢過程中的一些信息,這個區域也是棧,因爲是爲本地方法服務,所以稱作本地方法棧,其實和 Java虛擬機棧的功能幾乎差不多,只是Java虛擬機棧是爲Java方法服務,而本地方法棧是爲本地方法服務。在某些Java虛擬機中,其實直接着兩個棧合二爲一了。
    爲了以後看到有這個棧的虛擬機不陌生,所以我們的 JVM 體系結構中也來一個 本地方法棧

那麼根據這些分析,我們的 JVM 體系結構圖就變成了這樣:

而這個結構圖,其實就是 JVM 體系結構圖~


所以!你差不多是根據自己的分析知道了JVM體系結構!!記得給自己贊一個👍!

什麼?你問我每個結構是幹嘛的?我真的要一口老血噴出來….因爲如果你是跟 着分析一步步看下來的,那你肯定知道每個結構的作用了。


其實開始也是想直接給出一個結構圖,然後直接說每個結構的作用。但這樣的方式印象不夠深刻;而如果是帶着你一起分析和思考,然後一步步推出結構圖,那印象肯定會更深刻些,理解也會更深入些。(真的是,太暖了,這麼用心良苦,理工男果然是最暖的~)

注:如果猿兄這篇博客有任何錯誤和建議,歡迎大家留言,不勝感激!

至於JVM體系結構中每個結構的具體內容,我們一篇篇博客慢慢道來~

JVM 系列文章相關推薦:

  1. JVM 體系結構概述
  2. JVM 類加載器類型及類加載機制
  3. JVM 堆內存與垃圾回收
  4. 堆內存調優入門。(暫未更新)
  5. ……(持續更新)
  6. JVM 相關面試題及解答。(暫未更新)

持續更新,點個關注,不再迷路

這裏是 猿兄,爲你分享程序員的世界。

非常感謝各位優秀的程序員們能看到這裏,如果覺得文章還不錯的話,求點贊👍 求關注💗 求分享👬,對我來說真的 非常有用!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章