java的棧和堆

先用一張圖展示一下Java堆棧的概況

clipboard.png

方法區: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);
    }
}
  1. 新建一個main線程的一個棧
  2. jvm在方法區尋找是否存在Person類的信息
  3. 如果沒找到類加載器加載Person類信息到方法區,然後在堆中創建Person對象,並持有方法區的引用
  4. 把person添加到main主線程棧中,並指向堆上的Person實例。
  5. 執行person的sayhello方法,找到堆上的Person實例。
  6. 根據堆上Person的方法區引用,找到方法區上sayhello的字節碼,然後執行完成。

clipboard.png

下面用一段十分簡單的代碼段描述一下棧的運行過程。

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;
    }
}

clipboard.png

總結:

學習了一段時間Java虛擬機之後才發現Java虛擬機是如此的複雜,也體會到了自己的內功的不足,學習的過程中很大程度上參考的雲析學院的視頻,和Java虛擬機精講這本書,在此表示感謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章