1. 程式人生 > 程式設計 >Java記憶體模型中的虛擬機器棧原理分析

Java記憶體模型中的虛擬機器棧原理分析

  Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域,這些區域都會有各自的用途,以及建立和銷燬的時間,有的區域會隨著虛擬機器程序的啟動而存在,有些區域則依賴使用者執行緒的啟動和結束而建立和銷燬。Java虛擬機器所管理的記憶體將會包括以下幾個執行時資料區域。如下圖所示(圖片來自《深入理解Java虛擬機器》一書)。

  在記憶體中,棧分為兩部分,一部分是本地方法棧,為虛擬機器使用到的Native方法服務,具體的虛擬機器可以自由實現,另一部分就是虛擬機器棧,主要是為虛擬機器執行Java方法服務,因此也成為Java棧,本文主要是對虛擬機器棧進行詳細解讀。

  1. Java棧也稱為虛擬機器棧,也就是我們常常所說的棧。 Java棧是Java方法執行的記憶體模型。

  2. Java棧中存放的是一個個的棧幀,每個棧幀對應一個被呼叫的方法,在棧幀中包括區域性變量表(Local Variables)、運算元棧(Operand Stack)、指向當前方法所屬的類的執行時常量池(執行時常量池的概念在方法區部分會談到)的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些額外的附加資訊。 當執行緒執行一個方法時,就會隨之建立一個對應的棧幀,並將建立的棧幀壓棧。當方法執行完畢之後,便會將棧幀出棧。 因此對於方法沒有存在回收資源一說 。

  3. 區域性變量表,顧名思義,想必不用解釋大家應該明白它的作用了吧。就是用來儲存方法中的區域性變數(包括在方法中宣告的非靜態變數以及函式形參)。對於基本資料型別的變數,則直接儲存它的值,對於引用型別的變數,則存的是指向物件的引用。區域性變量表的大小在編譯器就可以確定其大小了,因此在程式執行期間區域性變量表的大小是不會改變的。

  4. 運算元棧,想必學過資料結構中的棧的朋友想必對錶達式求值問題不會陌生,棧最典型的一個應用就是用來對錶達式求值。想想一個執行緒執行方法的過程中,實際上就是不斷執行語句的過程,而歸根到底就是進行計算的過程。因此可以這麼說,程式中的所有計算過程都是在藉助於運算元 。

  5. 指向執行時常量池的引用,因為在方法執行的過程中有可能需要用到類中的常量,所以必須要有一個引用指向執行時常量。

  6. 方法返回地址,當一個方法執行完畢之後,要返回之前呼叫它的地方,因此在棧幀中必須儲存一個方法返回地址。

  7. 由於每個執行緒正在執行的方法可能不同,因此每個執行緒都會有一個自己的Java棧,互不干擾。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。