如何從編程的本質理解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)
書中解釋以下:jvm

  1. Java虛擬機棧是方法執行的內存模型。
  2. 本地方法棧爲虛擬機使用Native方法服務。
    除此以外,再加上程序計數器(Program Counter Register),爲當前線程所執行的字節碼的提供行號指示。
    主要的內存模型就畫出來了。

    其中,數據區是通用的,因此線程共有,而執行區是線程執行本身的,因此線程私有。函數式編程

    JVM內存模型

    再加上真正去執行程序的執行引擎,連接本地方法庫,JVM內存模型就很好理解了。

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

    以上。函數

    參考資料

    《深刻理解Java虛擬機》單元測試

    做者

相關文章
相關標籤/搜索