先用一張圖展示一下Java堆棧的概況
堆
方法區:class文件信息,運行時常量池,以及編譯器編譯後的代碼
堆:存儲對象,對象包含類的信息,指向方法區
棧
虛擬機棧:表示Java方法執行的內存模型,每調用一個方法就會爲每個方法生成一個棧幀(Stack Frame),用來存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每個方法被調用和完成的過程,都對應一個棧幀從虛擬機棧上入棧和出棧的過程。虛擬機棧的生命週期和線程是相同的
本地方法棧:一個支持native方法調用的JVM實現
程序計數器:程序計數器用來記錄當前正在執行的指令
用一個十分簡單的代碼段模擬一下Java堆棧的運行過程:
public class AppTest {
public static void main(String[] args) {
Person person = new Person("張三");
person.sayHello();
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("hello " + name);
}
}
- 新建一個main線程的一個棧
- jvm在方法區尋找是否存在Person類的信息
- 如果沒找到類加載器加載Person類信息到方法區,然後在堆中創建Person對象,並持有方法區的引用
- 把person添加到main主線程棧中,並指向堆上的Person實例。
- 執行person的sayhello方法,找到堆上的Person實例。
- 根據堆上Person的方法區引用,找到方法區上sayhello的字節碼,然後執行完成。
下面用一段十分簡單的代碼段描述一下棧的運行過程。
public class AppTest {
public static void main(String[] args) {
int a = 1;
int b = 2;
int c = add(a , b);
}
private static int add(int a, int b) {
return a + b;
}
}
總結:
學習了一段時間Java虛擬機之後才發現Java虛擬機是如此的複雜,也體會到了自己的內功的不足,學習的過程中很大程度上參考的雲析學院的視頻,和Java虛擬機精講這本書,在此表示感謝。