主管 Java 程序的運(yùn)行,它保存方法的局部變量、部分結(jié)果,并參與方法的調(diào)用和返回。每個(gè)線程在創(chuàng)建的時(shí)候都會(huì)創(chuàng)建一個(gè)虛擬機(jī)棧,其內(nèi)部保存一個(gè)個(gè)的棧幀(Stack Frame),對(duì)應(yīng)著一次次 Java 方法調(diào)用,是線程私有的,生命周期和線程一致。
特點(diǎn)
1、棧是一種快速有效的分配存儲(chǔ)方式,訪問速度僅次于程序計(jì)數(shù)器
2、JVM 直接對(duì)虛擬機(jī)棧的操作只有兩個(gè):每個(gè)方法執(zhí)行,伴隨著入棧(進(jìn)棧/壓棧),方法執(zhí)行結(jié)束出棧
3、棧不存在垃圾回收問題
4、可以通過參數(shù)-Xss來設(shè)置線程的最大棧空間,棧的大小直接決定了函數(shù)調(diào)用的最大可達(dá)深度
該區(qū)域有哪些異常?
1、如果采用固定大小的 Java 虛擬機(jī)棧,那每個(gè)線程的 Java 虛擬機(jī)棧容量可以在線程創(chuàng)建的時(shí)候獨(dú)立選定。如果線程請(qǐng)求分配的棧容量超過 Java 虛擬機(jī)棧允許的最大容量,Java 虛擬機(jī)將會(huì)拋出一個(gè) StackOverflowError 異常。
2、如果 Java 虛擬機(jī)棧可以動(dòng)態(tài)擴(kuò)展,并且在嘗試擴(kuò)展的時(shí)候無(wú)法申請(qǐng)到足夠的內(nèi)存,或者在創(chuàng)建新的線程時(shí)沒有足夠的內(nèi)存去創(chuàng)建對(duì)應(yīng)的虛擬機(jī)棧,那 Java 虛擬機(jī)將會(huì)拋出一個(gè)OutOfMemoryError異常。
棧幀的內(nèi)部結(jié)構(gòu)?
1、局部變量表(Local Variables)
2、操作數(shù)棧(Operand Stack)(或稱為表達(dá)式棧)
3、動(dòng)態(tài)鏈接(Dynamic Linking):指向運(yùn)行時(shí)常量池的方法引用
4、方法返回地址(Return Address):方法正常退出或異常退出的地址
5、一些附加信息