下面這個(gè)類(lèi)A里的int a,是存放在堆還是棧(Java虛擬機(jī)棧)內(nèi)存?
public class A {
int a = 0;
B b = new B();
}
b是對(duì)象的引用肯定是存放在堆內(nèi)存,那a呢?
看網(wǎng)上說(shuō)a也是存放在堆內(nèi)存,但看書(shū)上說(shuō):
Java虛擬機(jī)棧(VM Stack)的局部變量表存放了編譯期可知的各種基本數(shù)據(jù)類(lèi)型(boolean、byte、char、short、int、float、long、double)
求解
這里有比較清晰的說(shuō)明 https://stackoverflow.com/a/6...
簡(jiǎn)單翻譯下:
Heap space 堆空間: 所有存活的對(duì)象在此分配.
Stack space 棧空間: 方法調(diào)用時(shí)保存變量對(duì)象的引用或變量實(shí)例.
Perm space : 保存已加載的類(lèi)的信息.
如:
Student std = new Student();
執(zhí)行后內(nèi)存情況如下:
Heap堆: 保存 "new Student()"
Stack棧: 保存實(shí)例變量信息 "std"
Perm Space: 保存類(lèi) Student 的信息.
這是一般性的描述, 具體實(shí)際上與JVM的實(shí)現(xiàn)及CPU平臺(tái)相關(guān). JDK里的實(shí)現(xiàn)通常是基于棧的, 即先將變量壓入棧push,再invoke調(diào)用相應(yīng)的方法. 但Android的Smali實(shí)際的Dalvik虛擬機(jī)為適應(yīng)ARM處理,更多時(shí)用的是寄存器, 很多時(shí)調(diào)用是把方法的參數(shù)加載到各個(gè)寄存器,然后調(diào)用, 總之, 泛泛而言, java語(yǔ)言規(guī)范和jvm虛擬機(jī)規(guī)范是兩碼事, 你完成可以寫(xiě)一個(gè)不用堆或棧的虛擬機(jī), 誰(shuí)讓你長(zhǎng)得帥又這么有才呢 ;)
假設(shè)有下面一段代碼:
public class Memory {
public static void main(String[] args) { // Line 1
int i=1; // Line 2
Object obj = new Object(); // Line 3
Memory mem = new Memory(); // Line 4
mem.foo(obj); // Line 5
} // Line 9
private void foo(Object param) { // Line 6
String str = param.toString(); //// Line 7
System.out.println(str);
System.out.println(str==str.intern()); // Line 8
}
}
當(dāng)程序運(yùn)行到第5行(Line 5) 的內(nèi)存情況如下圖所示:
PS:
(Line 8),這行會(huì)輸出true,意味著來(lái)自己于string pool?
關(guān)于局部變量是否放在字符串池的問(wèn)題, 沒(méi)有找到太直接的說(shuō)法, 看上去不同的JVM版本有一些實(shí)現(xiàn)差導(dǎo). 不過(guò) @潘金蓮的評(píng)論可能更接近于事實(shí), 即局部變量(可能)不存在于字符串池, 希望看到的同學(xué)不要被這個(gè)圖誤導(dǎo), 想了解更多,查更多資料才好!
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。