久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

158次閱讀
沒有評論

共計 1504 個字符,預(yù)計需要花費 4 分鐘才能閱讀完成。

今天就跟大家聊聊有關(guān)怎么理解 Java 執(zhí)行過程中的內(nèi)存模型變化,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結(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)注丸趣 TV 行業(yè)資訊頻道,感謝大家的支持。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-25發(fā)表,共計1504字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 宽城| 壤塘县| 伊春市| 通海县| 武安市| 灵石县| 吕梁市| 屯门区| 华阴市| 吉水县| 新巴尔虎右旗| 五华县| 当涂县| 铁岭市| 蕲春县| 如东县| 晋宁县| 泰来县| 西华县| 甘谷县| 秦皇岛市| 田东县| 鹿泉市| 普兰店市| 如皋市| 莱阳市| 夏邑县| 兰考县| 齐河县| 临安市| 于田县| 呼图壁县| 天柱县| 吐鲁番市| 商南县| 凤山县| 五寨县| 黔西县| 青浦区| 柞水县| 舒城县|