1. 程式人生 > >關於JVM加載內存圖學習小密招

關於JVM加載內存圖學習小密招

變量初始化 找到 指令 str count img src 調用方法 class

先看如下代碼:

Person.java

public class Person {

private String name;

private int age;

static int count = 0;

public Person() {

}

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public void sayHi() {

System.out.println("姓名:"+this.name+",年齡:"+this.age);

}

}

TestPerson.java

public class TestPerson {

public static void main(String[] args) {

Person person = new Person("kallen",20);

person.sayHi();

}

}

對象初始化步驟:

1.虛擬機加載TestPerson類(包含準備,鏈接,初始化),提取類型信息(包含計算申請多大堆空間等),存儲到方法區。

2. 通過保持在方法區的字節碼(.class) 虛擬機開始執行main方法,main方法入棧(進入方法執行堆棧區)箭頭①方法入棧。
技術分享圖片

3. 進入main方法的第一條指令new Person("kallen",20);虛擬機看到new 就知道要分配空間了,去方法區找Person類,沒找到就裝載Person類,並把Person類的類型信息存儲到方法區。

通過存儲在方法區中Person 類的類型信息確定了實例對象需要分配的空間大小,在堆區分配指定大小的內存,並把實例對象的成員變量初始化為默認值(int初始化為0,引用變量初始為null)。此時,實例對象的內存分配完畢。這是new操作符的第一步。

技術分享圖片

new操作的第二步開始執行,調用構造方法,完成對象的初始化工作。然後把對象在堆空間的地址賦值給引用類型變量person。整條Person person = new Person("kallen",20);指令執行完成。
技術分享圖片
4. 調用sayHi(),通過person持有的引用,找到堆中的實例對象,通過實例對象持有的本類在方法區的引用,找到本類(Person)的類型信息,然後定位到sayHi方法,sayHi方法入棧,開始執行方法中的字節碼。圖中箭頭④調用方法。
技術分享圖片



關於JVM加載內存圖學習小密招