Java虛擬機器的組成

神棍先生發表於2018-02-11

Java虛擬機器主要分為以下五個區: 
一、方法區: 
1. 有時候也成為永久代,在該區內很少發生垃圾回收,但是並不代表不發生GC,在這裡進行的GC主要是對方法區裡的常量池和對型別的解除安裝 
2. 方法區主要用來儲存已被虛擬機器載入的類的資訊、常量、靜態變數和即時編譯器編譯後的程式碼等資料。 
3. 該區域是被執行緒共享的。 
4. 方法區裡有一個執行時常量池,用於存放靜態編譯產生的字面量和符號引用。該常量池具有動態性,也就是說常量並不一定是編譯時確定,執行時生成的常量也會存在這個常量池中。

二、堆 
java堆是所有執行緒所共享的一塊記憶體,在虛擬機器啟動時建立,幾乎所有的物件例項都在這裡建立,因此該區域經常發生垃圾回收操作。

三、虛擬機器棧: 
1. 虛擬機器棧也就是我們平常所稱的棧記憶體,它為java方法服務,每個方法在執行的時候都會建立一個棧幀,用於儲存區域性變數表、運算元棧、動態連結和方法出口等資訊。 
2. 虛擬機器棧是執行緒私有的,它的生命週期與執行緒相同。 
3. 區域性變數表裡儲存的是基本資料型別、returnAddress型別(指向一條位元組碼指令的地址)和物件引用,這個物件引用有可能是指向物件起始地址的一個指標,也有可能是代表物件的控制程式碼或者與物件相關聯的位置。區域性變數所需的記憶體空間在編譯器間確定 
4.運算元棧的作用主要用來儲存運算結果以及運算的運算元,它不同於區域性變數表通過索引來訪問,而是壓棧和出棧的方式 
5.每個棧幀都包含一個指向執行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支援方法呼叫過程中的動態連線.動態連結就是將常量池中的符號引用在執行期轉化為直接引用。

四、本地方法區 
本地方法區和虛擬機器棧類似,只不過本地方法棧為Native方法(對非java語言呼叫的介面)服務。

五、程式計數器 
記憶體空間小,位元組碼直譯器工作時通過改變這個計數值可以選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理和執行緒恢復等功能都需要依賴這個計數器完成。該記憶體區域是唯一一個java虛擬機器規範沒有規定任何OOM情況的區域。


相關文章