Java Memory Model
Java Memory Model,中文是記憶體模型。
記憶體分為3個區塊,3個區塊分別為Stack、Heap、Metaspace
- Stack堆疊,存放變數,以及基本型態(int,char,float,double,long,byte,boolean)。
- Heap堆,存放物件,會根據物件的大小建立一個記憶體空間,提供記憶體位址與變數對映。
- Metaspace,存放類別的metadata。
String Pool字串池放在Heap,存放字串常數。
基本資料型別
基本資料型別有int, char, float, double, boolean,字母以小寫開頭。
基本資料型別的值是放在stack中,以下是放入stack中的過程。
陣列記憶體位址複製
陣列是物件,「物件」都是放在「Heap」空間,「Stack」放的是「變數」,「變數」的值是存放「Heap」空間的「記憶體位址」。
陣列複製
遇到new關鍵字,就是在Heap中建立一個記憶體空間,空間大小根據物件類型所定義,此處定義大小為3。
Stack中的變數,存放「Heap」空間的「記憶體位址」。
箭頭指向for{}最後,代表已經執行完for迴圈,Heap中的記憶體位址中的值也被設成跟arr1的值是一樣的。
2維陣列
陣列存的是1維陣列的記憶體位址。
物件建立過程
Dog類別
1
2
3
4
5
6
7
8
9
10
11
class Dog {
public String name;
public int age;
public String color;
public Dog (String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
}
建立Dog
1
2
3
Dog white_dog = new Dog("小白",5,"白色");
Dog yellow_dog = new Dog("小黃",6,"黃色");
Dog black_dog = new Dog("小黑",7,"黑色");
new關鍵字(1),在Heap建立記憶體空間0x0070(2),Stack的white_dog變數存的是0x0070(3),Heap中0x0070位址中的name與age與color,全用預設值,int基本型別用0,name與color是String物件用null。
進入建構子,在String pool字串常數池,建立”小白”字串常數記憶體空間,Heap空間的物件name的值設成”小白”的記憶體位址。
age是int基本型別,直接設數字5。
color是String類別,在String pool字串常數池,建立”白色”字串常數記憶體空間,物件的color設成”白色”的記憶體位址。
三個物件建立完畢的記憶體模型
164 165 176 194 199 203 466