如何給女朋友講明白:Java中Stack(棧)與Heap(堆)

背景

Java中Stack(棧)與Heap(堆)是面試中被經常問到的一個話題。

有沒有對Java中Stack(棧)與Heap(堆)爛熟於心的童鞋,請舉手!!!(怎麼沒人舉手…)

這個時候蝸牛哥的對象弱弱的舉起了小手(這個對象不是new出來的哈)

女朋友:牛哥,誰要懟咱呀?我要不要先打個搖搖靈?

蝸牛哥:Heap(堆)與Stack(棧)是兩種內存區域,不是要幹架(沒文化真可怕…)

蝸牛哥:今天就來給你講講Java中Stack(棧)與Heap(堆)到底是什麼?

女朋友:好呀,好呀,搞明白了堆與棧,我是不是就是Java高級工程師了?

蝸牛哥:有牛哥在,你還怕搞不明白???

女朋友:嘻嘻,我已經拿好我的小本本準備好記筆記了

蝸牛哥:好的,那咱們這就開講

什麼是Stack(棧)內存?

Java中的Stack(棧)是內存的一部分,包含方法、局部變量和引用變量。Stack(棧)內存始終以 後進先出 順序引用。在Stack(棧)內存中創建局部變量。

什麼是Heap(堆)內存?

Heap(堆)是包含對象的內存部分,也可能包含引用變量。實例變量在Heap(堆)內存中創建。

Java中的內存分配

JVM將內存劃分爲以下部分。

  1. Heap(堆)
  2. Stack(棧)
  3. Code(代碼)
  4. Static(靜態)

這種內存劃分是有效管理內存所必需的。

  • Code(代碼) 內存包含所有您的字節碼
  • Stack(棧) 內存包含所有方法、局部變量和引用變量。
  • Heap(堆) 內存包含對象 (也可以含有引用變量)。
  • Static(靜態) 內存包含靜態數據/方法

本地和實例變量之間的區別

變量實例被聲明在類中但不包含方法內變量

class Student{ 
	int num; // num爲實例變量
	public void showData{}

局部變量被定義在方法內部,包含方法參數。

public void sum(int a){

int x = int a + 3;

// a,x是局部變量;

}

棧和堆之間的區別

讓我們舉個例子來更好地理解這一點。

考慮一下你的main方法調用方法m1

public void m1 {
int x = 20
}

在java棧中,將創建一個frame(棧幀)在方法m1中。

[

m1中的變量X也將在棧中爲m1的frame(棧幀)中創建(見下圖)。

[

方法m1調用方法m2。在java棧中,在m1的frame(棧幀)頂部爲m2創建一個新棧幀。


變量b和c也將在棧中的棧幀m2中創建。

public void m2(int b){
	boolean c;
}

同樣的方法m2是調用方法m3。同樣在棧頂部創建一個棧幀m3(見下圖)。

現在假設我們的方法m3正在爲類 “Account” 創建一個對象,它有兩個實例變量int p和int q。

Account {
	Int p;
	Int q;
}

這是方法m3的代碼

public void m3(){
	Account ref = new Account();
	// more code
}

語句new Account()將在堆中創建一個Account對象。

[

引用變量“ref”將在java堆中創建。

賦值“=”運算符將使引用變量指向堆中的對象。

一旦方法執行完,控制流程將返回調用方法。在裏的情況,就是返回到方法m2。

方法m3的棧將被刷新

由於引用變量ref將不再指向堆中的對象,因此它將符合垃圾回收的條件。

方法m2完成執行後。它將從堆棧彈出,其所有變量將被刷新,不再可用。

同樣對於方法m1。

最終,控制流程將返回程序的起始點。通常,就是“main”方法。

如果對象有一個引用作爲其實例變量怎麼辦?

public static void main(String args[]) {
  A parent = new A(); 
  //more code 
} 

class A{ 
  B child = new B(); 
  int e;
  //more code 
} 
  
class B{ 
  int c; 
  int d;  
  //more code 
}

在這種情況下,引用變量“child”將在堆中創建,而堆又將指向其對象,如下圖所示。

總結一下:

  • 調用方法時,會在棧頂部創建一個棧幀。
  • 一旦方法完成執行,控制流將返回到調用方法,並刷新其相應的棧幀。
  • 在棧中創建局部變量
  • 實例變量在堆中創建並且是它們所屬對象的一部分。
  • 在棧中創建引用變量。

“不積跬步,無以至千里”,希望未來的你能:有夢爲馬 隨處可棲!加油,少年!


關注公衆號:「Java 知己」,每天更新Java知識哦,期待你的到來!

  • 發送「1024」,免費領取 30 本經典編程書籍。
  • 發送「Group」,與 10 萬程序員一起進步。
  • 發送「面試」,領取BATJ面試資料、面試視頻攻略。
  • 發送「JavaEE 實戰」,領取《JavaEE 實戰》系列視頻教程。
  • 發送「玩轉算法」,領取《玩轉算法》系列視頻教程。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章