? ? ? ? 棧楨是用于虛擬機(jī)進(jìn)行方法調(diào)用和方法執(zhí)行時(shí)的數(shù)據(jù)結(jié)構(gòu),它是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)虛擬機(jī)棧的棧元素委乌。棧元素存儲(chǔ)了方法的局部變量表辛藻,操作數(shù)棧,動(dòng)態(tài)連接和方法返回地址等信息苫纤。每一個(gè)方法在執(zhí)行時(shí)都對(duì)應(yīng)著一個(gè)棧楨在虛擬機(jī)棧里面從入棧到出棧的過程碉钠。
? ? ? ? 在編譯代碼的時(shí)候,棧楨中需要多大的局部變量表卷拘,操作數(shù)棧的深度已經(jīng)確認(rèn)喊废。在活動(dòng)棧楨中,只有位于棧頂?shù)臈E才是有效的栗弟,稱為當(dāng)前棧楨污筷,與這個(gè)棧楨對(duì)應(yīng)的方法稱為當(dāng)前方法。
(1)局部變量表
局部變量表是一組變量值存儲(chǔ)空間乍赫,用于存放方法參數(shù)和方法內(nèi)部定義的局部變量瓣蛀,局部變量表以變量槽為最小單位,每個(gè)變量槽都能夠存放一個(gè)boolean,byte,char,short,int,float,reference,returnAddress類型的數(shù)據(jù)雷厂,這八種數(shù)據(jù)類型惋增,都可以使用32位或更小的物理內(nèi)存來存放。允許shot隨著操作系統(tǒng)或虛擬機(jī)的不同而變化改鲫。
(2)操作數(shù)棧
操作數(shù)棧的深度在編譯時(shí)確定诈皿,操作數(shù)棧的每一個(gè)元素可以是任意類型的Java數(shù)據(jù)類型,包括long和double像棘,32位數(shù)據(jù)類型所占的棧容量為1稽亏,64位為2。方法的執(zhí)行過程中缕题。會(huì)有各種字節(jié)碼指令往操作數(shù)棧中寫入和提取內(nèi)容截歉,也就是入棧出棧操作。
(3)動(dòng)態(tài)連接
每個(gè)棧楨都包含一個(gè)指向運(yùn)行時(shí)常量池中該棧楨所屬方法的引用烟零,持有這個(gè)引用是為了支持方法調(diào)用過程中的動(dòng)態(tài)連接瘪松。
(4)方法返回地址
方法退出過程實(shí)際上就等同于把當(dāng)前棧楨出棧,因此退出時(shí)可能執(zhí)行的操作有:恢復(fù)上層方法的局部變量表和操作數(shù)棧瓶摆,把返回值壓入調(diào)用者棧楨的操作數(shù)棧中凉逛,調(diào)用PC計(jì)數(shù)器的值以指向方法調(diào)用指令后面的一條指令等。