1. 程式人生 > >Java虛擬機器中棧,棧幀,區域性變量表的概念和特徵。

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虛擬機器之中是一致的。