-
1 # 行業車管家
-
2 # 丶南柯叄夢
和程式計數器一樣,Java虛擬機器棧也是執行緒私有的,它的生命週期和執行緒相同,描述的是 Java 方法執行的記憶體模型。
Java 記憶體可以粗糙的區分為堆記憶體(Heap)和棧記憶體(Stack),其中棧就是現在說的虛擬機器棧,或者說是虛擬機器棧中區域性變量表部分。 (實際上,Java虛擬機器棧是由一個個棧幀組成,而每個棧幀中都擁有:區域性變量表、運算元棧、動態連結、方法出口資訊。)
區域性變量表主要存放了編譯器可知的各種資料型別(boolean、byte、char、short、int、float、long、double)、物件引用(reference型別,它不同於物件本身,可能是一個指向物件起始地址的引用指標,也可能是指向一個代表物件的控制代碼或其他與此物件相關的位置)。
Java 虛擬機器棧會出現兩種異常:StackOverFlowError 和 OutOfMemoryError。
StackOverFlowError: 若Java虛擬機器棧的記憶體大小不允許動態擴充套件,那麼當執行緒請求棧的深度超過當前Java虛擬機器棧的最大深度的時候,就丟擲StackOverFlowError異常。
OutOfMemoryError: 若 Java 虛擬機器棧的記憶體大小允許動態擴充套件,且當執行緒請求棧時記憶體用完了,無法再動態擴充套件了,此時丟擲OutOfMemoryError異常。
Java 虛擬機器棧也是執行緒私有的,每個執行緒都有各自的Java虛擬機器棧,而且隨著執行緒的建立而建立,隨著執行緒的死亡而死亡。 -
3 # 東水雨
理解虛擬機器棧,應該先理解虛擬機器的執行原理以及記憶體佈局,這裡簡要說一下:虛擬機器顧名思義就是仿照作業系統,在作業系統上執行的可以執行其他程式的虛擬平臺。它從作業系統系統記憶體中佔據一大塊記憶體,然後將這一大塊記憶體模擬作業系統記憶體佈局,分成了Java堆記憶體,Java虛擬機器棧,方法區,程式計數器,本地方法棧。有這幾塊,就可以編譯和執行Java了。
那麼Java虛擬機器棧在其中有什麼作用呢?我們知道,作業系統執行本地程式方法呼叫實際上是對方法中的區域性變數,方法出入口資訊在系統暫存器進行存取的過程,這種執行稱作“面向暫存器”架構,而Java虛擬機器執行Java方法也是如此的流程,但是Java虛擬機器沒有暫存器的概念,因此分出了Java虛擬機器棧來模擬暫存器的作用,這稱之為“面向棧”架構。
所以Java虛擬機器棧的作用就是Java方法執行時建立一個棧幀,用於儲存方法中的區域性變數,運算元等資訊,再利用棧的先入後出特性完成方法呼叫。
希望可以幫助理解。
-
4 # 東水雨
理解虛擬機器棧,應該先理解虛擬機器的執行原理以及記憶體佈局,這裡簡要說一下:虛擬機器顧名思義就是仿照作業系統,在作業系統上執行的可以執行其他程式的虛擬平臺。它從作業系統系統記憶體中佔據一大塊記憶體,然後將這一大塊記憶體模擬作業系統記憶體佈局,分成了Java堆記憶體,Java虛擬機器棧,方法區,程式計數器,本地方法棧。有這幾塊,就可以編譯和執行Java了。
那麼Java虛擬機器棧在其中有什麼作用呢?我們知道,作業系統執行本地程式方法呼叫實際上是對方法中的區域性變數,方法出入口資訊在系統暫存器進行存取的過程,這種執行稱作“面向暫存器”架構,而Java虛擬機器執行Java方法也是如此的流程,但是Java虛擬機器沒有暫存器的概念,因此分出了Java虛擬機器棧來模擬暫存器的作用,這稱之為“面向棧”架構。
所以Java虛擬機器棧的作用就是Java方法執行時建立一個棧幀,用於儲存方法中的區域性變數,運算元等資訊,再利用棧的先入後出特性完成方法呼叫。
希望可以幫助理解。
回覆列表
其中,虛擬機器棧是一個後入先出的棧。棧幀是儲存在虛擬機器棧中的,棧幀是用來儲存資料和儲存部分過程結果的資料結構,同時也被用來處理動態連結(Dynamic Linking)、方法返回值和異常分派(Dispatch Exception)。執行緒執行過程中,只有一個棧幀是處於活躍狀態,稱為“當前活躍棧幀”,當前活動棧幀始終是虛擬機器棧的棧頂元素。