關於JVM加載內存圖學習小密招
先看如下代碼:
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加載內存圖學習小密招