運行原理
1、不同線程中所包含的棧幀是不允許存在相互引用的。
2、如果當(dāng)前方法調(diào)用了其他方法,方法返回之際,當(dāng)前棧幀會傳回此方法的執(zhí)行結(jié)果給當(dāng)前一個棧針,并且虛擬機會丟棄當(dāng)前棧幀,使得前一個棧幀重新成為當(dāng)前棧幀。
3、Java方法有兩種返回函數(shù)的方式,一種是正常的函數(shù)返回,使用return指令;另一種是拋出異常。不管使用哪種方式,都會導(dǎo)致棧幀被彈出。
實例
public class StackFrameTest {
public static void main(String[] args) {
StackFrameTest stackFrameTest = new StackFrameTest();
stackFrameTest.method1();
}
public void method1(){
System.out.println("method1()開始執(zhí)行");
method2();
System.out.println("method1()執(zhí)行結(jié)束");
}
public int method2(){
System.out.println("method2()開始執(zhí)行");
int i = 100;
int m = (int)method3();
System.out.println("method2()即將結(jié)束");
return i + m;
}
public double method3(){
System.out.println("method3()開始執(zhí)行");
double j = 3.1;
System.out.println("method3()即將結(jié)束");
return j;
}
}
知識點擴充:
1. Java棧也稱為虛擬機棧,也就是我們常常所說的棧。 Java棧是Java方法執(zhí)行的內(nèi)存模型。
2. Java棧中存放的是一個個的棧幀,每個棧幀對應(yīng)一個被調(diào)用的方法,在棧幀中包括局部變量表(Local Variables)、操作數(shù)棧(Operand Stack)、指向當(dāng)前方法所屬的類的運行時常量池(運行時常量池的概念在方法區(qū)部分會談到)的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些額外的附加信息。 當(dāng)線程執(zhí)行一個方法時,就會隨之創(chuàng)建一個對應(yīng)的棧幀,并將建立的棧幀壓棧。當(dāng)方法執(zhí)行完畢之后,便會將棧幀出棧。 因此對于方法沒有存在回收資源一說 。
3. 局部變量表,顧名思義,想必不用解釋大家應(yīng)該明白它的作用了吧。就是用來存儲方法中的局部變量(包括在方法中聲明的非靜態(tài)變量以及函數(shù)形參)。對于基本數(shù)據(jù)類型的變量,則直接存儲它的值,對于引用類型的變量,則存的是指向?qū)ο蟮囊谩>植孔兞勘淼拇笮≡诰幾g器就可以確定其大小了,因此在程序執(zhí)行期間局部變量表的大小是不會改變的。
4. 操作數(shù)棧,想必學(xué)過數(shù)據(jù)結(jié)構(gòu)中的棧的朋友想必對表達式求值問題不會陌生,棧最典型的一個應(yīng)用就是用來對表達式求值。想想一個線程執(zhí)行方法的過程中,實際上就是不斷執(zhí)行語句的過程,而歸根到底就是進行計算的過程。因此可以這么說,程序中的所有計算過程都是在借助于操作數(shù) 。
以上就是java虛擬機中棧的運行知識點總結(jié)的詳細內(nèi)容,更多關(guān)于java虛擬機中棧的運行原理的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- java虛擬機JVM類加載機制原理(面試必問)
- vmware虛擬機安裝deepin20最全詳細過程
- Java虛擬機類加載器之雙親委派機制模型案例
- Python動態(tài)規(guī)劃實現(xiàn)虛擬機部署的算法思想
- 最新虛擬機VMware 14安裝教程
- Python使用oslo.vmware管理ESXI虛擬機的示例參考
- Java虛擬機精選面試題20道
- Java reservedcodecachesize虛擬機參數(shù)案例詳解