Java - Stack 與 Heap 的分別
閱讀時間: 10分鐘
在使用Java開發程式的過程中,相信大家都可能見過stack和heap這兩個字,例如在一些Error中、在JVM中做一些設定(heap memory space跟stack memory space)等等。
但有部分人都未必真正了解這些字眼有什麼分別,想知道它們其實代表什麼,可以留下來,等我為你們講解一下。
它們都是JVM記憶體管理的一部分。
Stack
Stack是記憶體的其中一個部分
在程式中的local primitive variables、local object reference variables都會被儲存在Stack。
每一個 Thread 都擁有屬於自己的Stack。
Stack 是一種 後入先出 LIFO (last in, first out)的操作特色,優點是存取速度快和簡單管理。正因為Stack的特性,所以一些完全可預測變數或函數都會存放在Stack以違到讓系統可以全自動化管理的目的。
例子解釋:
public void Method1() { int i = 4; }
int i = 4,由於這個變數很明顯地只能在執行Method1時才能用到,所以它的生命周期是可預測的。自然就可以存放在stack。
public void Method2() { Method1(); }
Method1 只有在執行Method2時才能用到,所以它包含的變數也可以存放在stack。
Heap
Heap是記憶體的其中一個部分。
在程式中的instances/objects、instance variables都會被儲存在Heap直到不被使用為止/不受任何參考時。
在Java中的Garbage Collector機制會自動去刪除在Heap中沒有用的資料。
public static void main(String... ar) { Method3 o1= new Method3(); //Method3 的物件會儲存在heap但它的reference variable –o1 會儲存在stack。 } }