J2SE:小議堆(heap)和棧(stack)

以前的面試中偶爾會被問起這個,當(dāng)時回答的也是支支吾吾。有點(diǎn)慚愧,so,今天來認(rèn)真學(xué)習(xí)一番。

棧:(運(yùn)行時單位)

一些基本類型的變量對象的引用都是保存在棧中,當(dāng)變量或者對象的引用出了作用域就會自動釋放。

{                           
     int a = 99;            
}                           

以上代碼中,定義了一個int型變量a并給它賦初值,大括號范圍內(nèi)為a的作用域,當(dāng)代碼運(yùn)行完該段作用域后,會自動釋放掉為a分配的內(nèi)存空間。

堆:(存儲時單位)

通過new XXX()方式創(chuàng)建的對象保存在堆中(字符串常量、基本數(shù)據(jù)類型常量保存在常量池中

{                           
     Music myMusic = new Music();            
}                           

以上代碼會同時分配兩塊內(nèi)存,對象引用myMusic保存在棧中,對象Music保存在堆中。

當(dāng)程序運(yùn)行完new Music()的代碼后,該段代碼的作用域就已經(jīng)結(jié)束了,但是該對象仍然占據(jù)著內(nèi)存,在隨后的一個不確定的時候被垃圾回收器回收掉。

補(bǔ)充

如果棧內(nèi)存不夠,JVM會拋出java.lang.StackOverFlowError。
而如果是堆內(nèi)存不夠,JVM會拋出java.lang.OutOfMemoryError。

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

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

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