Java虛擬機——Java內存區域Java虛擬機棧

1:是什麼

⽤於作⽤於⽅法執⾏的⼀塊Java內存區域

2: 爲什麼

每個⽅法在執⾏的同時都會創建⼀個棧幀(Stack Framel)⽤於存儲局部變量表、操作數 棧、動態鏈接、⽅法出⼝等信息。每⼀個⽅法從調⽤直⾄執⾏完成的過程,就對應着⼀個棧 幀在虛擬機棧中⼊棧到出棧的過程

怎麼理解: 先看一張圖片,當方法A在Java虛擬機中運行,方法A會在虛擬機棧創建棧幀,就是你看到的圓圈,方法A的圓圈就會進入虛擬機棧,這個動作叫入棧,當方法執行結束之後,就會釋放方法A有關的資源,就像圖中的B方法,執行結束之後,方法B的圓圈就會從虛擬機棧出去,這個動作叫出棧。

補充信息

棧幀:

    jvm爲每個新創建的線程都分配一個堆棧。堆棧以幀爲單位保存線程的狀態。jvm對堆棧只進行兩種操作:以幀爲單位的壓棧和出棧操作。

    棧幀(Stack Frame)是用於支持虛擬機進行方法調用和方法執行的數據結構,它是虛擬機運行時數據區的虛擬機棧(Virtual Machine Stack)的棧元素。棧幀存儲了方法的局部變量表,操作數棧,動態連接和方法返回地址等信息。第一個方法從調用開始到執行完成,就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。

每一個棧幀都包括了局部變量表,操作數棧,動態連接,方法返回地址和一些額外的附加信息。在編譯代碼的時候,棧幀中需要多大的局部變量表,多深的操作數棧 都已經完全確定了,並且寫入到了方法表的Code屬性中,因此一個棧幀需要分配多少內存,不會受到程序運行期變量數據的影響,而僅僅取決於具體虛擬機的實 現

一個線程中的方法調用鏈可能會很長,很多方法都同時處理執行狀態。對於執行引擎來講,活動線程中,只有虛擬機棧頂的棧幀纔是有效的,稱爲當前棧幀 (Current Stack Frame),這個棧幀所關聯的方法稱爲當前方法(Current Method)。執行引用所運行的所有字節碼指令都只針對當前棧幀進行操作。棧幀的概念結構自行百度,關於棧幀的詳細內容可以參考這個鏈接(必看!!!)

http://www.bubuko.com/infodetail-1831642.html

3:特點,

  • 局部變量表存放了編譯期可知的各種基本數據類型(booleanbytecharshortintflfloatlongdouble)以及對象引⽤(reference 類型)
  • 如果線程請求的棧深度⼤於虛擬機所允許的深度,將拋出 StackOverflflowError 異常,可以參考下遞歸,當遞歸不停的調用自身的方法時候,沒有結束條件,方法會不停的入棧,不斷挑戰當前線程所容納的棧的容量(官方說法是深度),說明點:一堆人不斷涌入一間房,房間的容量是有限的,當人數超過房間的容量會出現飽和狀態無法接納後面的人。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章