JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫(xiě),JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的。
引入Java語(yǔ)言虛擬機(jī)后,Java語(yǔ)言在不同平臺(tái)上運(yùn)行時(shí)不需要重新編譯。Java語(yǔ)言使用Java虛擬機(jī)屏蔽了與具體平臺(tái)相關(guān)的信息,使得Java語(yǔ)言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。
跨平臺(tái),jvm 從軟件層面屏蔽不同操作系統(tǒng)在底層硬件與指令上的區(qū)別

jvm內(nèi)存模型.png
堆:存儲(chǔ)對(duì)象
棧(線(xiàn)程):分配棧幀空間,方法局部變量、操作數(shù)棧(分配變量被賦值的值的空間)、動(dòng)態(tài)鏈接、方法出口
- 棧幀(Stack Frame)是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)中的虛擬機(jī)棧(Virtual Machine Stack) 的棧元素。棧幀存儲(chǔ)了方法的局部變量表、操作數(shù)棧、動(dòng)態(tài)連接和方法返回地址等信息。每一個(gè)方法從調(diào)用開(kāi)始至執(zhí)行完成的過(guò)程,都對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧里面從入棧到出棧的過(guò)程。
- 操作數(shù)棧:當(dāng)一個(gè)方法剛剛開(kāi)始執(zhí)行的時(shí)候,這個(gè)方法的操作數(shù)棧是空的,在方法的執(zhí)行過(guò)程中,會(huì)有各種字節(jié)碼指令往操作數(shù)棧中寫(xiě)入和提取內(nèi)容,也就是出棧/入棧操作。例如,在做算術(shù)運(yùn)算的時(shí)候是通過(guò)操作數(shù)棧來(lái)進(jìn)行的,又或者在調(diào)用其他方法的時(shí)候是通過(guò)操作數(shù)棧來(lái)進(jìn)行參數(shù)傳遞的
程序計(jì)數(shù)器:每個(gè)線(xiàn)程執(zhí)行時(shí)都會(huì)生成一個(gè)程序計(jì)數(shù)器,當(dāng)一個(gè)線(xiàn)程被掛起,又開(kāi)始執(zhí)行時(shí),根據(jù)程序計(jì)數(shù)器的code,繼續(xù)執(zhí)行
方法區(qū):常量、靜態(tài)變量、類(lèi)信息
本地方法棧:被native修飾的方法
public class Test3 {
public int compute() {
int a = 1;
int b = 2;
int c = a + b;
return c;
}
public static void main(String[] args) {
Test3 test = new Test3();
int result = test.compute();
System.out.println(result);
}
}

運(yùn)行