Run-Time Data Areas - 運行時數(shù)據(jù)區(qū)域

2018-07-03 15:58 更新

JVM 運行時會有幾個運行時數(shù)據(jù)區(qū)域,如下圖所示。

The pc Register - 程序計數(shù)器

線程私有內(nèi)存,保存當前線程所執(zhí)行的字節(jié)碼的行號指示器,這里和計算機組成原理中的計數(shù)器不太一樣,計組中的 PC 指的是下一條要執(zhí)行的指令的地址。JVM 中常有多個線程執(zhí)行,故每條線程都需要有一個獨立的程序計數(shù)器。

如果線程執(zhí)行的是 Java 方法,哪兒計數(shù)器記錄的就是正在執(zhí)行的虛擬機字節(jié)碼指令的地址;如果執(zhí)行的是 Native 方法,這個計數(shù)器則為空。

P.S. 這塊內(nèi)存無OutOfMemoryError

Java Virtual Machine Stacks - Java 虛擬機棧

線程私有,虛擬機棧描述的是 Java 方法執(zhí)行的內(nèi)存模型,每個方法在執(zhí)行時會創(chuàng)建一個棧幀,棧幀中保存有局部變量表、操作數(shù)棧、動態(tài)鏈接和方法出口等。粗略來講 Java 內(nèi)存區(qū)分為堆和棧,實際上『棧』指的往往是虛擬機棧中的局部變量表部分。

局部變量表中存放了編譯期可知的各種基本數(shù)據(jù)類型、對象引用類型和 returnAddress 類型。方法運行期間局部變量表大小不變。

Native Method Stacks - 本地方法棧

和虛擬機棧類似,不過區(qū)別在于虛擬機棧為 Java 方法(字節(jié)碼)服務(wù),而本地方法棧為 Native 方法服務(wù)(類似 C 語言中的棧)。具體實現(xiàn)可將這兩者合二為一。

Heap - 堆

堆是被所有線程共享的一塊內(nèi)存區(qū)域。一般來說所有的對象實例和數(shù)組都要在堆上分配,但一些優(yōu)化技術(shù)導(dǎo)致不一定所有對象實例都在堆上分配。

Method Area - 方法區(qū)

各線程共享的一塊內(nèi)存區(qū)域,和操作系統(tǒng)中進程中的『文本段』有些類似,用于存儲虛擬機加載的類信息、常量、靜態(tài)常量和即時編譯器編譯后的代碼數(shù)據(jù)等。

Run-Time Constant Pool - 運行時常量池

這一部分是方法區(qū)的一部分,用于保存 Class 文件中編譯期生成的字面值和符號引用。

直接內(nèi)存

這一部分并不是虛擬機運行時的數(shù)據(jù)區(qū)域,用于 Native 函數(shù)分配堆外內(nèi)存,提高性能用(不必在操作系統(tǒng)堆和 Java 堆復(fù)制數(shù)據(jù))。

Reference

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號