java的棧和堆

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

clipboard.png

方法區:class文件信息,運行時常量池,以及編譯器編譯後的代碼
堆:存儲對象,對象包含類的信息,指向方法區學習

虛擬機棧:表示Java方法執行的內存模型,每調用一個方法就會爲每一個方法生成一個棧幀(Stack Frame),用來存儲局部變量表、操做數棧、動態連接、方法出口等信息。每一個方法被調用和完成的過程,都對應一個棧幀從虛擬機棧上入棧和出棧的過程。虛擬機棧的生命週期和線程是相同的this

本地方法棧:一個支持native方法調用的JVM實現spa

程序計數器:程序計數器用來記錄當前正在執行的指令線程

用一個十分簡單的代碼段模擬一下Java堆棧的運行過程:code

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虛擬機精講這本書,在此表示感謝。生命週期

相關文章
相關標籤/搜索