Stack

  • 在往stack儲存資料時不需查找,僅需儲存在最上面的區塊即可,非常快速
  • 任何要存在stack的資料必須有限且靜態(資料大小必須在編譯時就知道)
  • 函式的執行資料儲存在stack frames(actual execution stack),每個函式會有自己的frame區塊,當函式內宣告新變數時會將資料推到最上面的區塊。當每個函式結束時,會清除最上面的區塊,所有被推送到該區塊的變數將被清除。
  • 每個thread可以有自己的一個stack
  • 儲存在stack上的資料由OS操作,非常簡單明瞭
  • 儲存在stack上的資料為區域變數(資料型態、primitives或primitive constants)、指標及function frames
  • 當stack的size太大時會遇到stack overflow errors
  • 大多數的語言對於可以儲存在stack的資料是有限制的

Heap

  • 與stack不一樣,Heap需要使用指標尋找資料
  • 比起stack,尋找資料的速度稍慢,但可以存放更大量的資料
  • 動態大小的資料可以存放在Heap
  • 在同個APP中Heap共享於threads之間
  • 因為其動態的特性使得比較難維護和管理,這也是為什麼會有些語言會有自動記憶體管理的功能
  • 儲存在Heap中的有全域變數、reference types(objects, strings, maps和其他較複雜的資料結構)
  • 如果APP使用比被分配還要多的記憶體就會發生out of memory errors
  • 通常沒有限制可以存在Heap的大小,不過也是要看該應用程式被分配到多少記憶體

Garbage Collection(GC)

有分兩種

  • Mark & Sweep GC
  • Reference counting GC