[Java] Heap space vs. Stack

在理解Java是否為Pass by Value(參考這篇文章)之前,建議先了解heap和stack的功用。

  • Heap space:
    1. 當建立物件時,會在heap space分配一個空間給物件使用。
    2. 所有在heap space上的物件,都可以被其他的thread存取。
    3. Garbage Collection會清除heap space內沒有被使用到的物件。
    4. 可透過-Xms參數調整heap space的開始大小。
    5. 可透過-Xmx參數設定heap space的最大值。
    6. 假如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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Memory {

public static void main(String[] args) { // Line 1
int i=1; // Line 2
Object obj = new Object(); // Line 3
Memory mem = new Memory(); // Line 4
mem.foo(obj); // Line 5
} // Line 9

private void foo(Object param) { // Line 6
String str = param.toString(); //// Line 7
System.out.println(str);
} // Line 8

}

  1. 當開始執行程式時候,JVM會載入相關的class到heap space。
  2. 產生main thread並且建立它的stack。
  3. 執行Line2,因為i是基本型態,所以push其值到stack。
  4. 執行Line3,因為obj是物件,所以push它在heap space的位置到stack。
  5. 執行Line4,因為mem是物件,所以push它在heap space的位置到stack。
  6. 執行Line6,push obj在heap space的位置到stack。
  7. 執行Line7,push obj.toString()在heap space的位置到stack。
  8. 執行Line8,pop str和param。
  9. 執行Line9,pop mem、obj和i,程式執行結束。

如何透過pop屬於這個method的變數,推測實作方式或許是類似於四則運算。

例如:

  1. 執行Line1,push “{“。
  2. 執行Line6,push “{“。
  3. 執行Line8,一直pop,直到遇到”{“停止。
  4. 執行Line9,一直pop,直到遇到”{“停止。

參考資料: