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