Udemy Course Multithreading, Concurrency & Performance 13
由前面提到每個Stack屬於各自的thread
Stack就是Memory regions
- 裡面有等著被呼叫的Methods、傳入的參數、儲存的Local Variables
- Stack + Instruction Pointer = State of each thread’s execution
以下例子來描述Stack在Main thread(java對應通常就是Main方法)的變化
執行前:
由上可以理解為了稱為Stack
因為每個Method的frame的分派與失效都是後進先出
Stack的特性:
- 所有變數都屬於該Thread的Stack,thread間stack無法共用
- Thread一創建即分派各自的stack
- Stack的大小固定
- 如果呼叫的方法階層太過複雜,可能導致StackOverflow Exception
接著討論Memory region:Heap
Heap是屬於Process的shared memory region
所有的Thread在Heap內分享data,且允許使用並分配於Heap內的Object
所以有哪些是分配給Heap的? 如以下
Objects(anything created with the new operator)
- String
- Object
- Collection
- …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