在理解Java是否為Pass by Value(參考這篇文章)之前,建議先了解heap和stack的功用。
- Heap space:
- 當建立物件時,會在heap space分配一個空間給物件使用。
- 所有在heap space上的物件,都可以被其他的thread存取。
- Garbage Collection會清除heap space內沒有被使用到的物件。
- 可透過-Xms參數調整heap space的開始大小。
- 可透過-Xmx參數設定heap space的最大值。
- 假如heap space滿了,Java會丟出
Java Heap Space``` 1
2
3
4
5
6
7
* Stack:
1. 若變數是基本型態,就存放它的值。
2. 若變數是物件,就存放它在heap space的位置。
3. stack不能被其他thead存取。
4. 可透過-Xss參數調整stack大小。
5. 假如stack滿了,Java會丟出```java java.lang.StackOverFlowError
範例:
1 | public class Memory { |
- 當開始執行程式時候,JVM會載入相關的class到heap space。
- 產生main thread並且建立它的stack。
- 執行Line2,因為i是基本型態,所以push其值到stack。
- 執行Line3,因為obj是物件,所以push它在heap space的位置到stack。
- 執行Line4,因為mem是物件,所以push它在heap space的位置到stack。
- 執行Line6,push obj在heap space的位置到stack。
- 執行Line7,push obj.toString()在heap space的位置到stack。
- 執行Line8,pop str和param。
- 執行Line9,pop mem、obj和i,程式執行結束。
如何透過pop屬於這個method的變數,推測實作方式或許是類似於四則運算。
例如:
- 執行Line1,push “{“。
- 執行Line6,push “{“。
- 執行Line8,一直pop,直到遇到”{“停止。
- 執行Line9,一直pop,直到遇到”{“停止。