溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么理解Java 執(zhí)行過程中的內(nèi)存模型變化

發(fā)布時間:2021-11-20 14:50:49 來源:億速云 閱讀:143 作者:柒染 欄目:云計算

今天就跟大家聊聊有關(guān)怎么理解Java 執(zhí)行過程中的內(nèi)存模型變化,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

主要工作:嘗試以時間順序追蹤一遍 Java 執(zhí)行的整個過程,以及展示 JVM 中內(nèi)存模型的相應(yīng)變化。

主要目的:希望能夠通過 Java 執(zhí)行過程的冰山一角,增進對編程語言工作原理的理解。

以下面這段代碼為例,追蹤它的執(zhí)行過程:

public class Car {
    private int speed;

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public void getSpeed() {
        System.out.println(speed);
    }

    public static void main(String[] args) {
        Car car = new Car();
        car.setSpeed(3);
        car.getSpeed();
    }
}
二、執(zhí)行過程

接下來是具體的執(zhí)行過程,總共包含五個步驟:編譯、加載、執(zhí)行 main 方法、執(zhí)行成員方法、方法返回。

Step1:編譯

首先,在我們完成上述這段源碼之后,要想讓程序跑起來,我們需要將其編譯成為字節(jié)碼文件。字節(jié)碼是一種跨平臺的JVM機器語言,它能夠被JVM所解析,而無關(guān)底層的操作系統(tǒng)。

Step2:加載

當代碼需要被調(diào)用時,JVM 會加載目標字節(jié)碼至方法區(qū),并轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu),這里的加載過程是通過類加載器完成的。然后內(nèi)存中(不一定是堆)會生成一個代表這個類的 java.lang.Class 對象,作為方法區(qū)這個類的各種數(shù)據(jù)結(jié)構(gòu)的訪問入口。

怎么理解Java 執(zhí)行過程中的內(nèi)存模型變化

Step3:執(zhí)行 main 方法

main 方法可以通過 java.lang.Class 對象進行調(diào)用,參考如下代碼:

Method method = targetClass.getDeclareMethod("main", String[].class);
method.invoke(null, (Object) new String[0]);

之后 PC 寄存器將會指向方法區(qū)中的 main 函數(shù)地址,線程棧中會生成對應(yīng)的棧楨,其主要用于存放當前方法的局部變量表、操作棧、以及方法返回地址。接下來,PC 寄存器向后地址偏移,執(zhí)行引擎開始執(zhí)行 main 方法體。當語句 Car car = new Car() 執(zhí)行完畢,棧楨與堆中的相應(yīng)變化如下:

怎么理解Java 執(zhí)行過程中的內(nèi)存模型變化

Step4:執(zhí)行成員方法

對象 car 的 setSpeed 方法調(diào)用過程和 main 類似,通過索引 car 的成員方法地址,PC寄存器將指向方法區(qū)中的 setSpeed 函數(shù)地址,同時線程棧中將產(chǎn)生新的棧楨,其中的方法返回地址用于保存原有 PC 地址偏移。當賦值語句 this.speed = speed 執(zhí)行完畢,棧楨與堆中發(fā)生的相應(yīng)變化如下:

怎么理解Java 執(zhí)行過程中的內(nèi)存模型變化

Step5:方法返回

隨著 setSpeed 方法的執(zhí)行結(jié)束,Stack 中的相應(yīng)棧楨出棧,棧頂指針重新指向 main 棧楨。同時 PC 寄存器將根據(jù)方法返回地址進行還原,從而繼續(xù)執(zhí)行 main 的方法體。當 main 方法也執(zhí)行完畢出棧后,主線程與虛擬機實例銷亡,程序結(jié)束。

虛擬機或某一門程序語言,作為一種底層實現(xiàn),可以滿足上層用戶的絕大部分需求,但是需求是與時俱進的,總有一天用戶需要編寫自己的底層實現(xiàn),比如組件、框架、一門新語言。這時需要打開原有的規(guī)范,先破壞它,再重建它,從而定義自己的規(guī)范。這也許是我們需要探究底層的緣由之一吧。

看完上述內(nèi)容,你們對怎么理解Java 執(zhí)行過程中的內(nèi)存模型變化有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI