Kurt/Java - Stack & Heap

Created Mon, 21 Feb 2022 22:23:56 +0800 Modified Wed, 02 Nov 2022 05:33:26 +0000
369 Words 2 min

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 的空間,所以必須謹慎使用,尤其是在處理同步程式的時候