關(guān)鍵詞:堆與棧的定義,生存周期
定義
在運(yùn)行java程序時(shí),java把內(nèi)存劃分成兩種:一種是棧內(nèi)存,一種是堆內(nèi)存。
- 棧:存取速度較快,內(nèi)存容量小,遵循先進(jìn)后出的存取規(guī)則
- 堆:存取數(shù)度較慢,內(nèi)存容量較大,存取數(shù)據(jù)采用邏輯連續(xù)的鏈?zhǔn)酱嫒。磾?shù)據(jù)實(shí)際存取有可能在不連續(xù)的內(nèi)存塊中)
堆棧內(nèi)存大小是JVM自動(dòng)分配的,由于JVM版本不同,大小可能會(huì)有差異。
功能
棧:程序執(zhí)行,堆:數(shù)據(jù)存取。
-
存取數(shù)據(jù)類型:
- 棧:函數(shù)調(diào)用過(guò)程是在棧中完成的,所以局部變量,形式參數(shù)都是在棧中分配內(nèi)存的,當(dāng)參數(shù)類型是非基礎(chǔ)類型對(duì)象時(shí)棧中分配對(duì)象的引用,同時(shí),8大基礎(chǔ)類型的引用與值均在棧中分配(這里主要基于運(yùn)行速度的考量)。
- 堆:主要存取對(duì)象實(shí)例。
-
數(shù)據(jù)生命周期
- 棧:運(yùn)行時(shí)數(shù)據(jù)自動(dòng)入棧,當(dāng)數(shù)據(jù)出棧后,自動(dòng)銷毀。這也就說(shuō)明了局部變量的作用范圍。(在調(diào)用分配前,數(shù)據(jù)區(qū)的大小是已知的,該過(guò)程是在編譯時(shí)完成的)
- 堆:程序員使用new等獲取內(nèi)存空間請(qǐng)求,程序運(yùn)行后分配給內(nèi)存。同時(shí)當(dāng)存儲(chǔ)對(duì)象失去所有棧中的索引后,列入可清理的內(nèi)存清單,在之后的某一時(shí)刻被java垃圾回收機(jī)制GC回收。(這里是不知道數(shù)據(jù)內(nèi)存大小的,不知道數(shù)據(jù)的具體回收時(shí)間的)
-
數(shù)據(jù)共享
- 棧:棧中數(shù)據(jù)是共享的。上面提到基本數(shù)據(jù)類型的引用以及值均是存儲(chǔ)在棧中的,如果遇見(jiàn)int a=3;棧中創(chuàng)建a的引用,同時(shí)查找棧中是否存在3,若存在,建立明確指引方向;若不存在,存進(jìn)3。
- 堆:由于其本身僅存儲(chǔ)數(shù)據(jù),所以沒(méi)有數(shù)據(jù)共享。(注意:這里有一個(gè)String包裝,請(qǐng)參考[java字符串池][1])
[1]:[http://m.itdecent.cn/p/92085ebbfa71]
(標(biāo)注:這里還差線程。。。。。。。。。。。。。)