Java - Stack & Heap
Stack(堆疊)
Stack 是一種具有 LIFO(Last-In-First-Out) 特性的儲存空間。
Java 中的 Stack 用於「靜態記憶體分配」,包含基本型別的變數、函式的資訊、物件的 reference…等。
Stack 中的資料生命週期式規律的,在函式開始到結束之間,系統會自動去分配、收回,所以我們不必去操作。
Java Stack 的幾個小知識:
- 只有在函式執行時,變數才會存在 Stack 記憶體中
- 當 Stack 記憶體滿的時候,會出現 StackOverFlowError
- Stack 的存取速度和 Heap 相比是快的
- Stack 是線程安全(threadsafe),每個線程都有自己的 Stack
Heap(堆積)
Heap 是用於動態記憶體空間的配置。
使用 new 出來的 Object 就是存在 heap 中的,其 reference 會存放在 Stack 裡面。
Java Heap 的小知識:
- 當 Heap 空間滿的時候,會出現 OutOfMemoryError
- Heap 的存取速度比 Stack 慢
- 跟 Stack 相比,Heap 不算是會自動做 deallocate 的動作,需要 垃圾收集器(GC)去把沒用到的 Object 釋放掉
- Heap 也不像 Stack 那樣是 threadsafe 的空間,所以必須謹慎使用,尤其是在處理同步程式的時候