在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ [Java]對象的實例存放在Java虛擬機棧(VM Stack)的什么位置?

[Java]對象的實例存放在Java虛擬機棧(VM Stack)的什么位置?

比如一個類的成員變量:

Object obj = new Object();

obj是對象的實例,廣義上講是存放在「棧」上,指向「堆」上的內(nèi)存地址;具體講,我的印象里obj應(yīng)該是存放在運行時數(shù)據(jù)區(qū)的虛擬機棧(VM Stack)上,
我知道虛擬機棧存儲了棧幀:

一個完整的棧幀包含:局部變量表、操作數(shù)棧、動態(tài)連接信息、方法正常完成信息和方法異常完成信息。

其中局部變量表又存放了:

局部變量表存放編譯期可知的各種基本數(shù)據(jù)類型、對象引用類型和returnAddress類型(指向一條字節(jié)碼指令的地址:函數(shù)返回地址)。

問題是,棧幀隨著方法的執(zhí)行而入棧和出棧的,生命周期應(yīng)該很短吧;那么上面說的obj作為對象的引用和類的成員變量,是存放在棧幀里的局部變量表里的嗎?另外,一個函數(shù)的參數(shù)是存放在哪里的呢,也是局部變量表嗎?

回答
編輯回答
獨特范

Object obj = new Object();在內(nèi)存創(chuàng)建了兩份地址,一份是new Object()創(chuàng)建在堆上;一份是obj,這個就是對象引用,創(chuàng)建在棧上,指向 new Object()堆地址。如果Object obj = new Object()是在方法里執(zhí)行的,方法結(jié)束后obj就出棧被銷毀了,但是new Object()這個堆上的沒有被銷毀,要等gc回收。所有的對象引用和基本類型數(shù)據(jù)(比如int,byte,long,float,char等等)都是創(chuàng)建在棧上。函數(shù)參數(shù)跟函數(shù)內(nèi)參數(shù)一樣,把對象引用復(fù)制一份傳給目標(biāo)函數(shù),目標(biāo)函數(shù)執(zhí)行完就銷毀。

2017年2月19日 18:11