1. 程式人生 > >如何從程式設計的本質理解JVM記憶體模型

如何從程式設計的本質理解JVM記憶體模型

如何從程式設計的本質理解JVM記憶體模型

一般聊JVM記憶體模型都是把圖截出來,然後對著圖,解釋上面堆、棧之類的概念。這篇將分享下,如何從程式設計的本質上理解,JVM記憶體模型是什麼樣子,為什麼是這個樣子,不再死記硬背。

程式設計的本質

程式設計的本質是什麼,有這麼一句話,程式=演算法+資料結構。
這裡的"演算法"其實相當寬泛,而平時理解的演算法是指諸如排序、查詢等操作,相對狹隘。所以換一個解釋,我們把演算法解釋為對資料執行操作,簡稱執行。
這樣,程式的本質便是資料+執行
而JVM作為JAVA程式的執行載體,必然從邏輯上與其相對應。

JVM記憶體模型

因此,JVM記憶體模型可以分為這麼兩部分:資料區、執行區。

資料區

任何程式,無論實現語言,它的資料總是可分為兩類:元資料和業務資料。

  1. 元資料,指描述語言本身的資料,如類資訊、指標、引用、即時編譯程式碼等等。
  2. 業務資料,是指功能需求的資料,比如人事系統中的人員、部門資料,在面向物件的語言中以物件的形式存在。
    而在JVM記憶體模型中,元資料對應方法區(Method Area),而業務資料對應著Java堆(Java Heap)。
    書中解釋如下:
    Java堆:存放物件例項和陣列。
    方法區:儲存載入的類資訊、常量、靜態變數、即時編譯程式碼等
    因此,圖示如下。

執行區

執行部分,首先我們得理解程式執行的基本單位是什麼,是方法(或稱函式)


通常的程式入口是main方法,單元測試也是基於方法。
平時交流時,也會說調下這個物件的方法,而不是調下這個物件。
甚至還有專門的函數語言程式設計。
而在Java中,方法分為兩種:Java方法和Native方法
在記憶體模型中,Java方法對應Java虛擬機器棧(Java Virtual Machine Stacks),Native方法對應本地方法棧(Native Method Stack)
書中解釋如下:

  1. Java虛擬機器棧是方法執行的記憶體模型。
  2. 本地方法棧為虛擬機器使用Native方法服務。
    除此之外,再加上程式計數器(Program Counter Register),為當前執行緒所執行的位元組碼的提供行號指示。
    主要的記憶體模型就畫出來了。


    其中,資料區是通用的,所以執行緒共有,而執行區是執行緒執行自己的,所以執行緒私有。

    JVM記憶體模型

    再加上真正去執行程式的執行引擎,連結本地方法庫,JVM記憶體模型就很好理解了。

    對比下書上的結構,邏輯上一致。

    以上。

    參考資料

    《深入理解Java虛擬機器》

    作者