Java虛擬機(jī)堆棧
- 作者:新網(wǎng)
- 來(lái)源:新網(wǎng)
- 瀏覽:100
- 2018-05-15 14:33:53
棧(stack),位于通用RAM中,但通過(guò)它的“堆棧指針”可以從處理器哪里獲得支持。堆棧指針若向下移動(dòng),則分配新的內(nèi)存;若向上移動(dòng),則釋放那些內(nèi)存。存儲(chǔ)讀取速度,僅次于寄存器。存放基本類型數(shù)據(jù)變量和對(duì)象、數(shù)組等引用類型的引用!
棧(stack),位于通用RAM中,但通過(guò)它的“堆棧指針”可以從處理器哪里獲得支持。堆棧指針若向下移動(dòng),則分配新的內(nèi)存;若向上移動(dòng),則釋放那些內(nèi)存。存儲(chǔ)讀取速度,僅次于寄存器。存放基本類型數(shù)據(jù)變量和對(duì)象、數(shù)組等引用類型的引用!
<
div> 棧幀存儲(chǔ)了方法的局部變量表、操作數(shù)棧、動(dòng)態(tài)連接和方法返回地址等信息。
每一個(gè)方法從調(diào)用開(kāi)始到執(zhí)行完成的過(guò)程,就對(duì)應(yīng)著一個(gè)棧幀在
虛擬機(jī)棧里面從入棧到出棧(也叫彈棧)的過(guò)程。
對(duì)于棧,只有棧頂?shù)臈怯行У?,稱為當(dāng)前棧幀,這個(gè)棧幀所關(guān)聯(lián)的方法稱為當(dāng)前方法。執(zhí)行引擎所運(yùn)行的所有字節(jié)碼指令都只針對(duì)當(dāng)前棧幀進(jìn)行操作。
堆(heap),是一種通用性的內(nèi)存池(也存在于RAM中),用于存放所有的JAVA對(duì)象!
各存儲(chǔ)
空間就速度來(lái)說(shuō),有如下關(guān)系:寄存器 >堆棧 > 堆 > 其它。
棧中的數(shù)據(jù)大小和生命周期是可以確定的,當(dāng)沒(méi)有引用指向數(shù)據(jù)時(shí),這個(gè)數(shù)據(jù)就會(huì)消失。堆中的對(duì)象的由垃圾回收器gc負(fù)責(zé)回收。
結(jié)合實(shí)例:Student student=new Student();JVM在內(nèi)存中偷偷的做了什么?
加載Student.class文件進(jìn)入內(nèi)存
在棧內(nèi)存中為student開(kāi)辟空間,棧內(nèi)存中的局部變量表中存放student變量
在堆內(nèi)存中為學(xué)生對(duì)象開(kāi)辟空間
學(xué)生對(duì)象的成員變量默認(rèn)初始化(無(wú)參構(gòu)造方法)
學(xué)生對(duì)象的成員變量顯示初始化(有參構(gòu)造方法)(若沒(méi)有就不執(zhí)行)
通過(guò)構(gòu)造代碼塊對(duì)學(xué)生對(duì)象進(jìn)行初始化(若沒(méi)有就不執(zhí)行)
通過(guò)構(gòu)造方法對(duì)學(xué)生對(duì)象進(jìn)行初始化(通過(guò)構(gòu)造方法對(duì)學(xué)生對(duì)象的成員變量賦值)
對(duì)象初始化完畢
學(xué)生對(duì)象初始化完畢后,向外拋出產(chǎn)生的對(duì)象地址
讓變量student指向?qū)W生對(duì)象。