JAVA物件在JVM中記憶體分配

weixin_33890499發表於2017-04-22

如果你還不瞭解JVM記憶體模型的建議您先看下JVM記憶體模型

以一下程式碼為例,來分析下,java的例項物件在記憶體中的空間分配(JDK1.8)。

public class Student {

    private String name;
    private static Birthday birthday = new Birthday();

    public Student(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        Student s = new Student("zhangsan");
        int age = 10;
        System.out.println(age);
    }
}

class Birthday {
    private int year = 2010;
    private int month = 10;
    private int day = 1;
}

以Student類執行到main方法的最後一行時來分析java例項物件在記憶體中的分配情況。
如下圖:

2843224-ddc6a9b0d845a0d5.png
java物件在記憶體中的關係

圖畫的稍微有點問題,不過能說明物件在記憶體中的大致位置。

從圖中我們可以看出,普通的java例項物件記憶體分配,主要在這三個區域:虛擬機器棧、堆、方法區。

從記憶體區域來分析

  • 虛擬機器棧:只存放區域性變數
  • 堆:儲存物件的例項
  • 方法區:存放Class資訊和常量資訊。

從變數的角度來分析

  • 區域性變數:存放在虛擬機器棧中(具體應為[棧->棧幀->區域性變數表])
    • 基本型別的值直接存在棧中。如age=10
    • 如果是物件的例項,則只儲存物件例項的引用。如s=ref
  • 例項變數:存放在堆中的物件例項中。如Student的例項變數 name=ref
  • 靜態變數:存放在方法區中的常量池中。如Student.class中的birthday=ref。
    • 如果常量的型別是物件的例項則只儲存物件例項的引用地址

通過變數的角度來分析,我們就可以瞭解為什麼靜態變數不用new就能呼叫,而例項變數必須new出物件,才能呼叫。

想了解更多精彩內容請關注我的公眾號

2843224-af50fe51e979ebd0.png

相關文章