1. 程式人生 > >JMM(JVM記憶體模型)

JMM(JVM記憶體模型)

Java通過多執行緒機制實現多工並行處理。

所有執行緒共享JVM記憶體(main memory),同時執行緒又有自己的工作記憶體。

當執行緒與主存進行互動時,資料從主存複製到工作記憶體中,由執行緒進行處理。

JVM的邏輯記憶體模型中,包含如下幾個部分:
1)程式計數器
2)虛擬機器棧
3)本地方法棧
4)Java堆
5)方法區

一、程式計數器

程式計數器是一塊較小的記憶體空間。它可以被理解為是當前正在執行的位元組碼指令的指示器。位元組碼直譯器就是通過程式計數器來選取下一條要執行的位元組碼指令。程式的分支、跳轉、迴圈、執行緒切換都依賴程式計數器。

Java是多執行緒的,但是在任一時刻,一個處理器核心只能執行一個執行緒中的指令。因此,為了執行緒切換後能夠恢復到正常的位置繼續執行,需要為每一個執行緒配備一個獨立的程式計數器。

注意,程式計數器是JVM中唯一不會丟擲OutOfMemoryError的記憶體區域。

二、虛擬機器棧

與程式計數器一樣,虛擬機器棧也是執行緒私有的。虛擬機器棧體現了Java方法執行的記憶體模型。每個方法執行前都會建立一個棧幀,用於存放區域性變量表等資訊。方法的呼叫到執行完畢的過程,就對應了一個棧幀從入棧到出棧的過程。

區域性變量表所需的記憶體大小在編譯期確定,在方法執行期間不會改變區域性變量表的大小。

注意,當執行緒請求的棧深度超過虛擬機器允許的最大棧深度時,會丟擲StackOverflowError。如果棧深度可以動態擴充套件,當無法申請到足夠的記憶體空間時,會丟擲OutOfMemoryError。

三、本地方法棧

本地方法棧和虛擬機器棧的功能是非常相似的,不同的是,本地方法棧是為native方法呼叫服務的。同時,本地方法棧也會丟擲StackOverflowError和OutOfMemoryError。

四、Java堆

Java堆在虛擬機器啟動時建立,是被所有執行緒共享的一塊記憶體。它的作用是存放物件例項。Java堆也是垃圾回收器管理的主要區域。注意,當沒有記憶體可以建立物件例項,並且堆也無法再擴充套件時,會丟擲OutOfMemoryError。

五、方法區

方法區用於存放類資訊、靜態變數、常量等資料。當方法區無法滿足記憶體需求時,也會丟擲OutOfMemoryError。