以前的面試中偶爾會被問起這個做院,當時回答的也是支支吾吾。有點慚愧濒持,so键耕,今天來認真學習一番。
棧:(運行時單位)
一些基本類型的變量
和對象的引用
都是保存在棧中柑营,當變量或者對象的引用出了作用域就會自動釋放郁竟。
{
int a = 99;
}
以上代碼中,定義了一個int型變量a并給它賦初值由境,大括號范圍內為a的作用域棚亩,當代碼運行完該段作用域后蓖议,會自動釋放掉為a分配的內存空間。
堆:(存儲時單位)
通過new XXX()方式創(chuàng)建的對象保存在堆中(字符串常量讥蟆、基本數(shù)據(jù)類型常量保存在常量池中
)
{
Music myMusic = new Music();
}
以上代碼會同時分配兩塊內存勒虾,對象引用myMusic保存在棧中,對象Music保存在堆中瘸彤。
當程序運行完new Music()的代碼后修然,該段代碼的作用域就已經結束了,但是該對象仍然占據(jù)著內存质况,在隨后的一個不確定的時候被垃圾回收器回收掉愕宋。
補充
如果棧內存不夠,JVM會拋出java.lang.StackOverFlowError结榄。
而如果是堆內存不夠中贝,JVM會拋出java.lang.OutOfMemoryError。