Udemy Course Multithreading, Concurrency & Performance 13

Stack & Heap Memory Regions概念

ZONGRU Li
Jul 26, 2021

由前面提到每個Stack屬於各自的thread

Stack就是Memory regions

  1. 裡面有等著被呼叫的Methods、傳入的參數、儲存的Local Variables
  2. Stack + Instruction Pointer = State of each thread’s execution

以下例子來描述Stack在Main thread(java對應通常就是Main方法)的變化

執行前:

執行到int y = 2時Stack內儲存情況
呼叫到另一個方法時,會多出一個frame來儲存,但是這個新frame不知道x與y
最終sum method計算得出的值回到main內
最終程式執行結束,Stack內儲存的東西即失效

由上可以理解為了稱為Stack

因為每個Method的frame的分派與失效都是後進先出

Stack的特性:

  1. 所有變數都屬於該Thread的Stack,thread間stack無法共用
  2. Thread一創建即分派各自的stack
  3. Stack的大小固定
  4. 如果呼叫的方法階層太過複雜,可能導致StackOverflow Exception

接著討論Memory region:Heap

Heap是屬於Process的shared memory region

所有的Thread在Heap內分享data,且允許使用並分配於Heap內的Object

所以有哪些是分配給Heap的? 如以下

Objects(anything created with the new operator)

  1. String
  2. Object
  3. Collection
  4. …etc

Members of classes

Static variables

其中Heap是被Java的virtual machines的Garbage Collector(GC)管理

儲存於Heap內的Objects將保存直到無法被參考

儲存於Heap內的Members of classes會一直保存,只要他父階層Objects還存在

Static Variables 則會永久保存(跟應用程式Process並存)

Objects vs References

其中要注意!

References 不等於 Objects 如下例:

Object refrerenceVar1 = new Object();

Object refrerenceVar2 = refrerenceVar1;

由上程式實際對應如下,我們將有三個entities

並且有兩個reference並指向單一個Object

結論:

Reference可被分配在stack(在Method中被宣告為變數)

若reference是class的成員之一,則也可跟著父階層Object分配在heap

Object則都只儲存在heap

參考課程

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet