Java虛擬機棧

和程序計數器一樣,Java虛擬機棧也是線程私有的,它的生命週期和線程相同。

虛擬機棧描述的是java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀(stack Frame)用於存放局部變量表、操作數棧、動態鏈接、方法出口等信息。每個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。

局部變量表存放了編譯期可知的各種基本數據類型(boolean、byte、char、short、int、float、double)、對象引用類型(reference類型和returnAddress類型)。其中64位長度的long和double類型的數據會佔用兩個局部變量空間(slot),其餘數據類型只佔用1個局部變量空間。

當進入一個方法時,這個方法需要在幀中分配多大的局部變量空間是完全確定的,在方法運行期間不會改變局部變量表的大小。

在Java虛擬機規範中,對這個區域規定了兩種異常情況:如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常。(一個線程執行時調用多個方法,因此會有多個棧幀入棧);

如果虛擬機棧可以動態擴展(當前大部分Java虛擬機都可以動態擴展),如果擴展時無法申請到足夠的內存,就會拋出OutOfMemoryError異常。

發佈了109 篇原創文章 · 獲贊 130 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章