以前的面試中偶爾會被問起這個,當(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。