Stack 與 Heap in JVM memory

更新於 發佈於 閱讀時間約 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的垃圾回收器回收並釋放記憶體空間。
留言
avatar-img
留言分享你的想法!
avatar-img
Genos's Coding Diary的沙龍
6會員
19內容數
我的Java學習日記
2023/10/03
為何要重寫equals方法? 為何要重寫hashCode方法?
2023/10/03
為何要重寫equals方法? 為何要重寫hashCode方法?
2023/09/27
兩種方式進行物件比較,使用Comparator或使用Comparable
2023/09/27
兩種方式進行物件比較,使用Comparator或使用Comparable
2023/09/27
併發,多個事情在同一時間段內同時發生 並行,多個事情在同一個時間點上同時發生
2023/09/27
併發,多個事情在同一時間段內同時發生 並行,多個事情在同一個時間點上同時發生
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
題目會給我們個陣列target,問我們從整數串流中1~n之中,如何透過stack 的 push和pop來模擬生成target指定的形式?
Thumbnail
題目會給我們個陣列target,問我們從整數串流中1~n之中,如何透過stack 的 push和pop來模擬生成target指定的形式?
Thumbnail
題目會給我們一組定義好的Stack 堆疊的介面,要求底層用兩個或一個Queue來實現。 也就是說,要求我們用一個或兩個FIFO的Queues去實作出一個LIFO的Stack
Thumbnail
題目會給我們一組定義好的Stack 堆疊的介面,要求底層用兩個或一個Queue來實現。 也就是說,要求我們用一個或兩個FIFO的Queues去實作出一個LIFO的Stack
Thumbnail
題目會給我們一組定義好的Queue 佇列的介面,要求底層用兩個stack來實現。 也就是說,要求我們用兩個LIFO的stacks去實作出一個FIFO的Queue
Thumbnail
題目會給我們一組定義好的Queue 佇列的介面,要求底層用兩個stack來實現。 也就是說,要求我們用兩個LIFO的stacks去實作出一個FIFO的Queue
Thumbnail
JavaScript Array 基本操作筆記
Thumbnail
JavaScript Array 基本操作筆記
Thumbnail
題目會給定一組已經規定好的介面interface,要求我們實作HashSet這種資料結構。也就是一般數學和程式語言中所說的"集合"。
Thumbnail
題目會給定一組已經規定好的介面interface,要求我們實作HashSet這種資料結構。也就是一般數學和程式語言中所說的"集合"。
Thumbnail
程式建立thread,然後會交給硬體中的scheduler去排定執行、切換資源 我們無法強制指定順序,因為電腦有太多任務需要執行,但資源有限,因此會由scheduler去分配、切換資源 電腦能同時執行多項任務
Thumbnail
程式建立thread,然後會交給硬體中的scheduler去排定執行、切換資源 我們無法強制指定順序,因為電腦有太多任務需要執行,但資源有限,因此會由scheduler去分配、切換資源 電腦能同時執行多項任務
Thumbnail
每個method都有一個自己的stack Instance Variable 會存在heap中 Local Variable 會存在stack中
Thumbnail
每個method都有一個自己的stack Instance Variable 會存在heap中 Local Variable 會存在stack中
Thumbnail
以一個雜魚測試工程師的角度來看int應用場景
Thumbnail
以一個雜魚測試工程師的角度來看int應用場景
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News