背景
Java中Stack(棧)與Heap(堆)是面試中被經常問到的一個話題。
有沒有對Java中Stack(棧)與Heap(堆)爛熟於心的童鞋,請舉手!!!(怎麼沒人舉手…)
這個時候蝸牛哥的對象弱弱的舉起了小手(這個對象不是new出來的哈)
女朋友:牛哥,誰要懟咱呀?我要不要先打個搖搖靈?
蝸牛哥:Heap(堆)與Stack(棧)是兩種內存區域,不是要幹架(沒文化真可怕…)
蝸牛哥:今天就來給你講講Java中Stack(棧)與Heap(堆)到底是什麼?
女朋友:好呀,好呀,搞明白了堆與棧,我是不是就是Java高級工程師了?
蝸牛哥:有牛哥在,你還怕搞不明白???
女朋友:嘻嘻,我已經拿好我的小本本準備好記筆記了
蝸牛哥:好的,那咱們這就開講
什麼是Stack(棧)內存?
Java中的Stack(棧)是內存的一部分,包含方法、局部變量和引用變量。Stack(棧)內存始終以 後進先出 順序引用。在Stack(棧)內存中創建局部變量。
什麼是Heap(堆)內存?
Heap(堆)是包含對象的內存部分,也可能包含引用變量。實例變量在Heap(堆)內存中創建。
Java中的內存分配
JVM將內存劃分爲以下部分。
- Heap(堆)
- Stack(棧)
- Code(代碼)
- 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 實戰》系列視頻教程。
- 發送「玩轉算法」,領取《玩轉算法》系列視頻教程。