3 回答

TA貢獻1777條經(jīng)驗 獲得超10個贊
是一個抽象的概念,并不是真實存在的,涵蓋了緩存、寫緩沖區(qū)、寄存器以及其他的硬件和編譯器優(yōu)化,每一個線程都有一個本地內(nèi)存,其中有主內(nèi)存中對象的拷貝值,

TA貢獻1820條經(jīng)驗 獲得超10個贊
jvm內(nèi)存模型:Java代碼是運行在Java虛擬機之上的,由Java虛擬機通過解釋執(zhí)行(解釋器)或編譯執(zhí)行(即時編譯器)來完成,故Java內(nèi)存模型,也就是指Java虛擬機的運行時內(nèi)存模型。
運行時內(nèi)存模型,分為線程私有和共享數(shù)據(jù)區(qū)兩大類,其中線程私有的數(shù)據(jù)區(qū)包含程序計數(shù)器、虛擬機棧、本地方法區(qū),所有線程共享的數(shù)據(jù)區(qū)包含Java堆、方法區(qū),在方法區(qū)內(nèi)有一個常量池。java運行時的內(nèi)存模型圖,如下:
從圖中,可知內(nèi)存分為線程私有和共享兩大類:
(1)線程私有區(qū),包含以下3類:
程序計數(shù)器,記錄正在執(zhí)行的虛擬機字節(jié)碼的地址;
虛擬機棧:方法執(zhí)行的內(nèi)存區(qū),每個方法執(zhí)行時會在虛擬機棧中創(chuàng)建棧幀;
本地方法棧:虛擬機的Native方法執(zhí)行的內(nèi)存區(qū);
(2)線程共享區(qū),包含以下2類
Java堆:對象分配內(nèi)存的區(qū)域;
方法區(qū):存放類信息、常量、靜態(tài)變量、編譯器編譯后的代碼等數(shù)據(jù);
常量池:存放編譯器生成的各種字面量和符號引用,是方法區(qū)的一部分。
樓主提到的Java棧,一般而言是指圖中的虛擬機棧,在代碼中的方法調(diào)用過程中,往往需要從一個方法跳轉(zhuǎn)到另一個方法,執(zhí)行完再返回,那么在跳轉(zhuǎn)之前需要在當前方法的基本信息壓入棧中保存再跳轉(zhuǎn)。
三、關(guān)于寄存器的問題
對于java最常用的虛擬機,sun公司提供的hotspot虛擬機,是基于棧的虛擬機;而對于android的虛擬機,則采用google提供的dalvik,art兩種虛擬機,在android 5.0以后便默認采用art虛擬機,這是基于寄存器的虛擬機。 樓主問的是jvm(即java vm),這是基于棧的虛擬機。那么關(guān)于虛擬機棧,這塊內(nèi)存的內(nèi)容,我們再進一步詳細分析,如下圖:
可以看到,在虛擬機棧有一幀幀的 棧幀組成,而棧幀包含局部變量表,操作棧等子項,那么線程在運行的時候,代碼在運行時,是通過程序計數(shù)器不斷執(zhí)行下一條指令。真正指令運算等操作時通過控制操作棧的操作數(shù)入棧和出棧,將操作數(shù)在局部變量表和操作棧之間轉(zhuǎn)移。

TA貢獻1801條經(jīng)驗 獲得超16個贊
- 3 回答
- 0 關(guān)注
- 1225 瀏覽
添加回答
舉報