今天就跟大家聊聊有關(guān)怎么理解Java 執(zhí)行過(guò)程中的內(nèi)存模型變化,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)主營(yíng)安定網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app開發(fā),安定h5小程序開發(fā)搭建,安定網(wǎng)站營(yíng)銷推廣歡迎安定等地區(qū)企業(yè)咨詢
主要工作:嘗試以時(shí)間順序追蹤一遍 Java 執(zhí)行的整個(gè)過(guò)程,以及展示 JVM 中內(nèi)存模型的相應(yīng)變化。
主要目的:希望能夠通過(guò) Java 執(zhí)行過(guò)程的冰山一角,增進(jìn)對(duì)編程語(yǔ)言工作原理的理解。
以下面這段代碼為例,追蹤它的執(zhí)行過(guò)程:
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();
}
}
接下來(lái)是具體的執(zhí)行過(guò)程,總共包含五個(gè)步驟:編譯、加載、執(zhí)行 main 方法、執(zhí)行成員方法、方法返回。
Step1:編譯
首先,在我們完成上述這段源碼之后,要想讓程序跑起來(lái),我們需要將其編譯成為字節(jié)碼文件。字節(jié)碼是一種跨平臺(tái)的JVM機(jī)器語(yǔ)言,它能夠被JVM所解析,而無(wú)關(guān)底層的操作系統(tǒng)。
Step2:加載
當(dāng)代碼需要被調(diào)用時(shí),JVM 會(huì)加載目標(biāo)字節(jié)碼至方法區(qū),并轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),這里的加載過(guò)程是通過(guò)類加載器完成的。然后內(nèi)存中(不一定是堆)會(huì)生成一個(gè)代表這個(gè)類的 java.lang.Class 對(duì)象,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)結(jié)構(gòu)的訪問(wèn)入口。
Step3:執(zhí)行 main 方法
main 方法可以通過(guò) java.lang.Class 對(duì)象進(jìn)行調(diào)用,參考如下代碼:
Method method = targetClass.getDeclareMethod("main", String[].class);
method.invoke(null, (Object) new String[0]);
之后 PC 寄存器將會(huì)指向方法區(qū)中的 main 函數(shù)地址,線程棧中會(huì)生成對(duì)應(yīng)的棧楨,其主要用于存放當(dāng)前方法的局部變量表、操作棧、以及方法返回地址。接下來(lái),PC 寄存器向后地址偏移,執(zhí)行引擎開始執(zhí)行 main 方法體。當(dāng)語(yǔ)句 Car car = new Car() 執(zhí)行完畢,棧楨與堆中的相應(yīng)變化如下:
Step4:執(zhí)行成員方法
對(duì)象 car 的 setSpeed 方法調(diào)用過(guò)程和 main 類似,通過(guò)索引 car 的成員方法地址,PC寄存器將指向方法區(qū)中的 setSpeed 函數(shù)地址,同時(shí)線程棧中將產(chǎn)生新的棧楨,其中的方法返回地址用于保存原有 PC 地址偏移。當(dāng)賦值語(yǔ)句 this.speed = speed 執(zhí)行完畢,棧楨與堆中發(fā)生的相應(yīng)變化如下:
Step5:方法返回
隨著 setSpeed 方法的執(zhí)行結(jié)束,Stack 中的相應(yīng)棧楨出棧,棧頂指針重新指向 main 棧楨。同時(shí) PC 寄存器將根據(jù)方法返回地址進(jìn)行還原,從而繼續(xù)執(zhí)行 main 的方法體。當(dāng) main 方法也執(zhí)行完畢出棧后,主線程與虛擬機(jī)實(shí)例銷亡,程序結(jié)束。
虛擬機(jī)或某一門程序語(yǔ)言,作為一種底層實(shí)現(xiàn),可以滿足上層用戶的絕大部分需求,但是需求是與時(shí)俱進(jìn)的,總有一天用戶需要編寫自己的底層實(shí)現(xiàn),比如組件、框架、一門新語(yǔ)言。這時(shí)需要打開原有的規(guī)范,先破壞它,再重建它,從而定義自己的規(guī)范。這也許是我們需要探究底層的緣由之一吧。
看完上述內(nèi)容,你們對(duì)怎么理解Java 執(zhí)行過(guò)程中的內(nèi)存模型變化有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
本文標(biāo)題:怎么理解Java執(zhí)行過(guò)程中的內(nèi)存模型變化
URL標(biāo)題:http://www.rwnh.cn/article8/jgpoop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、網(wǎng)站改版、網(wǎng)站設(shè)計(jì)、Google、用戶體驗(yàn)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)