java中的堆與棧

關(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)注:這里還差線程。。。。。。。。。。。。。)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容