JVM程式計數器,虛擬機器棧,本地方法棧

zmy愛吃炸雞發表於2020-10-22

程式計數器

它記錄了程式執行位元組碼的行號和指令,位元組碼直譯器的工作就是改變程式計數器的值,切換下一條需要執行的指令(分支,迴圈,跳轉,異常等)。java虛擬機器是多執行緒透過輪流切換CPU時間片的方式實現,在同一時間內,CPU只會執行一個執行緒中的一個指令,為了每次切換回來都能到正確的執行位置,每個執行緒都會有一個獨立的執行緒計數器,每個計數器不會相互影響,並且是執行緒私有的。由於不是開發者操作,所以是不會產生異常的。

虛擬機器棧

虛擬機器棧也是執行緒私有的,它的宣告週期與執行緒一樣(和執行緒同生死)。如果執行緒請求棧的深度大於虛擬機器所允許的深度則會報錯 StackOverFlow的錯誤。如果虛擬機器可以動態擴充套件,如果擴充套件後無法獲得到記憶體,就會報錯 OutOfMemoryError。java虛擬機器棧描述的是Java方法執行的記憶體模型,每個方法執行的同時都會建立一個棧幀,對於我們來說主要關注棧記憶體,也是方法內的區域性變數。

棧幀

棧幀虛擬機器進行方法呼叫和方法執行的資料結構,它是虛擬機器執行時資料區虛擬機器棧的棧元素。棧幀儲存了方法的區域性變數表,運算元棧,動態連結和方法返回地址資訊。在程式編譯期,棧幀需要多大的區域性變數表記憶體,多深的運算元棧已經確定。在活動執行緒中,棧頂的棧幀才是有效的,與這個棧幀關聯的方式是當前方法,執行引擎執行的所有位元組碼指令都只會作用於當前棧幀。
img

本地方法棧

本地方法棧和虛擬機器棧發揮的作用基本一樣。區別是:本地方法棧執行的是Native方法服務,而虛擬機器棧執行的是java方法。在HotSpot vm中本地方法棧和虛擬機器棧合二為一。
img
注意:
當一個執行緒呼叫本地方法時,就會進入了一個不受java虛擬機器限制的世界,它和虛擬機器有著同樣的許可權。本地方法可以透過本地介面訪問虛擬機器執行時資料區。它可以直接使用本地處理器的暫存器。並不是所有的JVM都支援本地方法。如果JVM產品不打算支援Native方法,也可以不用實現本地方法棧。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983768/viewspace-2728752/,如需轉載,請註明出處,否則將追究法律責任。

相關文章