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

jvm內(nèi)存模型.png
堆:存儲對象
棧(線程):分配棧幀空間,方法局部變量、操作數(shù)棧(分配變量被賦值的值的空間)、動態(tài)鏈接、方法出口
- 棧幀(Stack Frame)是虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)中的虛擬機(jī)棧(Virtual Machine Stack) 的棧元素。棧幀存儲了方法的局部變量表、操作數(shù)棧、動態(tài)連接和方法返回地址等信息。每一個方法從調(diào)用開始至執(zhí)行完成的過程,都對應(yīng)著一個棧幀在虛擬機(jī)棧里面從入棧到出棧的過程。
- 操作數(shù)棧:當(dāng)一個方法剛剛開始執(zhí)行的時候,這個方法的操作數(shù)棧是空的,在方法的執(zhí)行過程中,會有各種字節(jié)碼指令往操作數(shù)棧中寫入和提取內(nèi)容,也就是出棧/入棧操作。例如,在做算術(shù)運(yùn)算的時候是通過操作數(shù)棧來進(jìn)行的,又或者在調(diào)用其他方法的時候是通過操作數(shù)棧來進(jìn)行參數(shù)傳遞的
程序計(jì)數(shù)器:每個線程執(zhí)行時都會生成一個程序計(jì)數(shù)器,當(dāng)一個線程被掛起,又開始執(zhí)行時,根據(jù)程序計(jì)數(shù)器的code,繼續(xù)執(zhí)行
方法區(qū):常量、靜態(tà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)行
參考jvm指令手冊