如何從編程的本質理解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虛擬機》

作者


免責聲明!

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



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