Java虛擬機中棧,棧幀,局部變量表的概念和特徵。

Java虛擬機棧的特徵:

線程私有:

後進先出(LIFO)棧

java虛擬機棧和程序計數器一樣,他是線程私有的內存區域,他的生命週期與線程相同,java虛擬機棧描述的是java方法執行時候的內存概念模型,每個方法在執行的時候都會創建一個棧幀,用來創建這個方法的操作數棧,局部變量表,方法出口,動態鏈接等信息,每一個方法在調用和結束的過程就對應了一個棧幀在虛擬機棧中入棧到出棧的過程,java虛擬機棧是一個後進先出棧,靠後執行的方法會優先完成,後面進入虛擬機棧的棧幀優先被出棧,這與我們平時執行java方法的印象是一致的,在程序執行中java方法的調用,執行和退出,都與java虛擬機棧裏面存儲的棧幀有着密切的聯繫。

兩種異常:

1.OutOfMemoryError

2.StackOverflowError:如果線程請求的棧深度大於java虛擬機允許的最大深度將會拋出StackOverflowError異常。如果java虛擬機棧被設計成可以動態擴展而動態擴展時又無法申請到足夠的內存將會拋出OutOfMemoryError異常。

Java本地方法棧的特徵:

本地方法棧和java虛擬機棧十分相似,差別不過是java虛擬機棧是爲了java虛擬機執行字節碼所服務,而本地方法棧則是爲了執行native方法所服務的所以本地方法也是一個私有的內存區域,也是後進先出棧,作用是支撐native方法的調用,執行和退出與java虛擬機棧一樣也會出現以上兩種異常,可以自己選擇實現本地方法棧,有一些虛擬機(如HotSpot)將java虛擬機棧和本地方法棧合併實現。


棧幀的概念和特徵:



局部變量表概念和特徵:

1:由若干個Slot組成,長度有編譯期決定:

局部變量表是一組變量值的存儲空間,它用於存儲方法,參數,以及方法內部定義的局部變量。在java編譯器編譯class的時候就在該方法的code屬性中確定了該方法所需的最大容量,局部變量表中的變量槽也就是Slot爲最小單位,java虛擬機中並沒有指明一個Slot所需要佔用的內存空間大小,只是非常有導向性的描述到任何一個Slot都應該能存放一個布爾型,字節型,字符型,短整型,整形,浮點型,reference類型以及returnAddress類型的數據在這8種數據類型之中,他們的共同特徵是都可以使用32位或者更小的內存空間來進行存放,但Java虛擬機這樣描述Slot的空間與明確指出每個Slot應該佔用32位內存還是有差別的,他這種描述允許Slot的內存空間隨着處理器,操作系統或者java虛擬機的具體實現而發生變化,假如在64位的java虛擬機之中使用了64位的內存空間去實現一個Slotjava虛擬機仍然要使用對齊或者補白的手段,讓Slot在外觀上看出來了與32位的java虛擬機之中是一致的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章