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,存放字串常數。

img

基本資料型別

基本資料型別有int, char, float, double, boolean,字母以小寫開頭。

基本資料型別的值是放在stack中,以下是放入stack中的過程。

img

img

img

陣列記憶體位址複製

陣列是物件,「物件」都是放在「Heap」空間,「Stack」放的是「變數」,「變數」的值是存放「Heap」空間的「記憶體位址」。

img

img

img

陣列複製

遇到new關鍵字,就是在Heap中建立一個記憶體空間,空間大小根據物件類型所定義,此處定義大小為3。

Stack中的變數,存放「Heap」空間的「記憶體位址」。 img

箭頭指向for{}最後,代表已經執行完for迴圈,Heap中的記憶體位址中的值也被設成跟arr1的值是一樣的。 img

2維陣列

陣列存的是1維陣列的記憶體位址。 img

img

物件建立過程

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。 img

進入建構子,在String pool字串常數池,建立”小白”字串常數記憶體空間,Heap空間的物件name的值設成”小白”的記憶體位址。 img

age是int基本型別,直接設數字5。 img

color是String類別,在String pool字串常數池,建立”白色”字串常數記憶體空間,物件的color設成”白色”的記憶體位址。 img

三個物件建立完畢的記憶體模型 img

164 165 176 194 199 203 466

results matching ""

    No results matching ""