Java虛擬機(jī)(JVM)具有多個(gè)組成部分,其中包括Java虛擬機(jī)棧和本地方法棧。虛擬機(jī)棧和本地方法棧可以理解為Java程序執(zhí)行的兩個(gè)不同的環(huán)境,其區(qū)別如下。
Java虛擬機(jī)棧是用于存儲(chǔ)Java方法執(zhí)行環(huán)境的空間。每當(dāng)一個(gè)線程通過(guò)調(diào)用一個(gè)Java方法,JVM系統(tǒng)就會(huì)在虛擬機(jī)棧上創(chuàng)建一個(gè)與之對(duì)應(yīng)的棧幀。一個(gè)棧幀包含了局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、返回地址等部分。在方法執(zhí)行過(guò)程中,棧幀根據(jù)程序執(zhí)行的順序被順序壓入和彈出虛擬機(jī)棧。
public static void main(String[] args) {
int a = 1;
add(a);
}
public static int add(int a) {
int b = a + 1;
return b;
}
以上代碼可以看做在main方法中調(diào)用了add方法,在add方法中創(chuàng)建了一個(gè)棧幀。這個(gè)棧幀包含了兩個(gè)局部變量a和b,a的值為1,b的值為2。在執(zhí)行完add方法后,虛擬機(jī)棧彈出這個(gè)棧幀,并將方法返回值壓入棧幀之前的那個(gè)棧幀的操作數(shù)棧。
本地方法棧與虛擬機(jī)棧的作用類似,它是為本地方法服務(wù)的。在Java程序中,有時(shí)調(diào)用的是本地方法而不是Java方法,本地方法指的是由其他語(yǔ)言開(kāi)發(fā)的,能被JVM調(diào)用的方法。與Java方法類似,每次調(diào)用一個(gè)本地方法也會(huì)產(chǎn)生一個(gè)棧幀。將本地方法的棧幀與Java方法的棧幀分開(kāi)可以使本地方法的返回地址和Java方法的返回地址得到正確的處理,并避免對(duì)JVM的影響。
總之,虛擬機(jī)棧和本地方法棧是Java程序運(yùn)行過(guò)程中不可分割的兩個(gè)部分。他們各自負(fù)責(zé)管理不同的方法執(zhí)行環(huán)境,不管是Java方法還是本地方法,在調(diào)用過(guò)程中都會(huì)被它們所管理。