Stack 與 Heap in JVM memory

2023/09/19閱讀時間約 3 分鐘
每個method都有一個自己的stack
Instance Variable 會存在heap中
Local Variable 會存在stack中

程式片段

public class Demo {
public static void main(String[] args) {

int data = 10;
Calculator calc = new Calculator();
int result = calc.add(2, 9);
System.out.println(result);

Calculator calc2 = new Calculator();
calc2.add(3, 7);
}
}

class Calculator {
int num = 20;

public int add(int n1, int n2) {
System.out.println(num);
return n1 + n2;
}
}

有兩個class,Demo和Calculator

Demo有:
4個 local variable -> data、calc、result、calc2
1個main method

Calculator有:
1個instance variable -> num
1個add method

說明

raw-image

每個method在JVM中都擁有自己的stack memory

而stack中存的是local variable

add method的 stack中的n1和n2的值,2跟9是從上方程式片段第6行的參數值帶入做範例。
因此main stack中的result變數的值才會是2+9=11

當第6行的add method執行完並返回結果給result之後,add stack就會被釋放。當下一次被呼叫add method時才會再建立一個對應物件的add method stack。

calc和calc2是由Calculator class 建(new)出來,指向Calculator物件的reference variable,同時也是main method中的local variable,所以存在main stack中

被建出來的物件會被存在Heap memory中,並被分發一個地址(例如123, 129隨便)

而後,該地址就會被存到calc和calc2的值的欄位做記錄,訴說著: 當你有事要找calc的時候,請去地址123敲門。然後你可能就帶入12跟23等兩個參數給calc的add method,此時就會建立一個add stack並將12作為n1、23作為n2帶入做計算使用

總結

  • method中宣告的變數會被存在Stack memory中。
  • 所有透過new關鍵字創建的物件會被存在Heap memory並分配地址供Stack memory中的reference variable指向。
  • 基本上除了長駐method(e.g. 進入點main method)之外的method都會在使用時才建立stack memory做資料的暫存計算使用,並在使用完畢後被記憶體釋放掉以免佔用。
  • Heap memory中的資料生命週期通常與整個應用程式的生命週期相同,除非真的很久沒有被呼叫使用,才會被JVM的垃圾回收器回收並釋放記憶體空間。
我的Java學習日記
留言0
查看全部
發表第一個留言支持創作者!