JVM之棧和堆
阿新 • • 發佈:2019-01-01
棧:存放基本資料型別和物件的引用變數。
堆:存放物件。
堆主要是用來存放物件的,棧主要是用來執行程式的。相較於堆,棧的存取速度更快,但棧的大小和生存期必須是確定的,因此缺乏一定的靈活性。而堆卻可以在執行時動態的分配記憶體,生存期不用提前告訴編譯器,這也導致了其存取速度的緩慢。
堆和棧的存取如下例所示:
class Rectangle{
private int width;
private int length;
public Rectangle(int width, int length){
this.width = width;
this.length = length;
}
}
public class Test{
public static void main(String[] args){
int i = 9;
Rectangle r = new Rectangle(3, 5);
}
}
在上述程式進入main()方法後,資料的儲存關係如圖4-11所示:
由於i為基本資料型別的區域性變數,因此它儲存在棧空間,而r是物件的引用變數,因此也被儲存在棧空間中;實際的物件儲存在堆空間中,當main()方法退出後,儲存在棧中的i和r通過壓棧和彈棧操作將會在棧中被回收,而儲存在堆中的物件將會由垃圾回收器來自動回收。