布景
Java中Stack(棧)與Heap(堆)是面試中被常常問到的一個話題。
有沒有對Java中Stack(棧)與Heap(堆)純熟于心的童鞋,請舉手?。。。ㄔ趺礇]人舉手…)
這個時分蝸牛哥的目標(biāo)弱弱的舉起了小手(這個目標(biāo)不是new出來的哈)
女朋友:牛哥,誰要懟咱呀?我要不要先打個搖搖靈?
蝸牛哥:Heap(堆)與Stack(棧)是兩種內(nèi)存區(qū)域,不是要干架(沒文化真可怕…)
蝸牛哥:今日就來給你講講Java中Stack(棧)與Heap(堆)到底是什么?
女朋友:好呀,好呀,搞明白了堆與棧,我是不是便是Java高級工程師了?
蝸牛哥:有牛哥在,你還怕搞不明白???
女朋友:嘻嘻,我已經(jīng)拿好我的小本本準(zhǔn)備好記筆記了
蝸牛哥:好的,那咱們這就開講
什么是Stack(棧)內(nèi)存?
Java中的Stack(棧)是內(nèi)存的一部分,包括辦法、局部變量和引證變量。Stack(棧)內(nèi)存一直以后進先出次序引證。在Stack(棧)內(nèi)存中創(chuàng)立局部變量。
什么是Heap(堆)內(nèi)存?
Heap(堆)是包括目標(biāo)的內(nèi)存部分,也或許包括引證變量。實例變量在Heap(堆)內(nèi)存中創(chuàng)立。
Java中的內(nèi)存分配
JVM將內(nèi)存劃分為以下部分。
Heap(堆)
Stack(棧)
Code(代碼)
Static(靜態(tài))
這種內(nèi)存劃分是有效辦理內(nèi)存所必需的。
Code(代碼)內(nèi)存包括所有您的字節(jié)碼。
Stack(棧)內(nèi)存包括所有辦法、局部變量和引證變量。
Heap(堆)內(nèi)存包括目標(biāo)(也可以含有引證變量)。
Static(靜態(tài))內(nèi)存包括靜態(tài)數(shù)據(jù)/辦法。
本地和實例變量之間的區(qū)別
變量實例被聲明在類中,但不包括辦法內(nèi)變量
classStudent{intnum;//num為實例變量publicvoidshowData{}
局部變量被界說在辦法內(nèi)部,包括辦法參數(shù)。
publicvoidsum(inta){intx=inta+3;//a,x是局部變量;}
棧和堆之間的區(qū)別
讓咱們舉個例子來更好地了解這一點。
考慮一下你的main辦法調(diào)用辦法m1
publicvoidm1{intx=20}
在java棧中,將創(chuàng)立一個frame(棧幀)在辦法m1中。
m1中的變量X也將在棧中為m1的frame(棧幀)中創(chuàng)立(見下圖)。
辦法m1調(diào)用辦法m2。在java棧中,在m1的frame(棧幀)頂部為m2創(chuàng)立一個新棧幀。
變量b和c也將在棧中的棧幀m2中創(chuàng)立。
publicvoidm2(intb){booleanc;
}
同樣的辦法m2是調(diào)用辦法m3。同樣在棧頂部創(chuàng)立一個棧幀m3(見下圖)。
現(xiàn)在假定咱們的辦法m3正在為類“Account”創(chuàng)立一個目標(biāo),它有兩個實例變量intp和intq。
Account{Intp;Intq;
}
這是辦法m3的代碼
publicvoidm3(){
Accountref=newAccount();//morecode}
語句newAccount()將在堆中創(chuàng)立一個Account目標(biāo)。
引證變量“ref”將在java堆中創(chuàng)立。
賦值“=”運算符將使引證變量指向堆中的目標(biāo)。
一旦辦法履行完,操控流程將回來調(diào)用辦法。在里的狀況,便是回來到辦法m2。
辦法m3的棧將被改寫
由于引證變量ref將不再指向堆中的目標(biāo),因而它將契合垃圾回收的條件。
辦法m2完結(jié)履行后。它將從倉庫彈出,其所有變量將被改寫,不再可用。
同樣關(guān)于辦法m1。
最終,操控流程將回來程序的起始點。一般,便是“main”辦法。
如果目標(biāo)有一個引證作為其實例變量怎么辦?
publicstaticvoidmain(Stringargs[]){
Aparent=newA();//morecode}classA{
Bchild=newB();inte;//morecode}classB{intc;intd;//morecode}
在這種狀況下,引證變量“child”將在堆中創(chuàng)立,而堆又將指向其目標(biāo),如下圖所示。
總結(jié)一下:
調(diào)用辦法時,會在棧頂部創(chuàng)立一個棧幀。
一旦辦法完結(jié)履行,操控流將回來到調(diào)用辦法,并改寫其相應(yīng)的棧幀。
在棧中創(chuàng)立局部變量
實例變量在堆中創(chuàng)立并且是它們所屬目標(biāo)的一部分。
在棧中創(chuàng)立引證變量。
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長沙市天心區(qū)芙蓉中路三段398號新時空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運營網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號