如何從程式設計的本質理解JVM記憶體模型
阿新 • • 發佈:2018-12-04
如何從程式設計的本質理解JVM記憶體模型
一般聊JVM記憶體模型都是把圖截出來,然後對著圖,解釋上面堆、棧之類的概念。這篇將分享下,如何從程式設計的本質上理解,JVM記憶體模型是什麼樣子,為什麼是這個樣子,不再死記硬背。
程式設計的本質
程式設計的本質是什麼,有這麼一句話,程式=演算法+資料結構。
這裡的"演算法"其實相當寬泛,而平時理解的演算法是指諸如排序、查詢等操作,相對狹隘。所以換一個解釋,我們把演算法解釋為對資料執行操作,簡稱執行。
這樣,程式的本質便是資料+執行。
而JVM作為JAVA程式的執行載體,必然從邏輯上與其相對應。
JVM記憶體模型
因此,JVM記憶體模型可以分為這麼兩部分:資料區、執行區。
資料區
任何程式,無論實現語言,它的資料總是可分為兩類:元資料和業務資料。
- 元資料,指描述語言本身的資料,如類資訊、指標、引用、即時編譯程式碼等等。
- 業務資料,是指功能需求的資料,比如人事系統中的人員、部門資料,在面向物件的語言中以物件的形式存在。
而在JVM記憶體模型中,元資料對應方法區(Method Area),而業務資料對應著Java堆(Java Heap)。
書中解釋如下:
Java堆:存放物件例項和陣列。
方法區:儲存載入的類資訊、常量、靜態變數、即時編譯程式碼等
因此,圖示如下。
執行區
執行部分,首先我們得理解程式執行的基本單位是什麼,是方法(或稱函式)
通常的程式入口是main方法,單元測試也是基於方法。
平時交流時,也會說調下這個物件的方法,而不是調下這個物件。
甚至還有專門的函數語言程式設計。
而在Java中,方法分為兩種:Java方法和Native方法
在記憶體模型中,Java方法對應Java虛擬機器棧(Java Virtual Machine Stacks),Native方法對應本地方法棧(Native Method Stack)
書中解釋如下:
- Java虛擬機器棧是方法執行的記憶體模型。
本地方法棧為虛擬機器使用Native方法服務。
除此之外,再加上程式計數器(Program Counter Register),為當前執行緒所執行的位元組碼的提供行號指示。
主要的記憶體模型就畫出來了。
其中,資料區是通用的,所以執行緒共有,而執行區是執行緒執行自己的,所以執行緒私有。JVM記憶體模型
再加上真正去執行程式的執行引擎,連結本地方法庫,JVM記憶體模型就很好理解了。
對比下書上的結構,邏輯上一致。
以上。參考資料
《深入理解Java虛擬機器》
作者
- 作者:初開
- 我的開發小站:http://dev.chukai.pro