1. 程式人生 > 實用技巧 >JVM執行時資料區域

JVM執行時資料區域

Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體劃分成為若干個不同的資料區域。

  • 程式計數器(Program Counter Register)

每一個執行緒都有一個程式計數器,各執行緒之間互不影響,獨立儲存,屬於執行緒的私有記憶體。如果執行緒正在執行一個Java方法,這個計數器記錄的是正在執行的虛擬機器位元組碼指令地址;如果正在執行的是Native方法,這個計數器則為空(Undefined)。此記憶體區域是唯一一個在Java虛擬機器規範中沒有規定任何OutOfMemoryError情況的區域。

  • Java虛擬機器棧(Java Virtual Machine Stacks)

與程式計數器一樣,Java虛擬機器棧也是執行緒私有的,它的生命週期與執行緒相同。虛擬機器棧描述的是Java方法執行的記憶體模型:每個方法在執行的時候都會建立一個棧幀(Stack Frame)用於儲存區域性變量表、運算元棧、動態連結、方法出口等資訊。每一個方法從呼叫直至執行完成的全過程,就對應著一個棧幀在虛擬機器棧中入棧到出棧的過程。

  • 本地方法棧

本地方法棧(Native Method Stack)與虛擬機器棧發揮的作用是非常相似的,它們之間的區別不過是虛擬機器棧為虛擬機器執行Java方法服務,而本地方法棧則為虛擬機器使用到的Native方法服務。

  • Java堆(Heap)

Java堆是虛擬機器所管理的記憶體中最大的一塊。Java堆是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動時建立。此記憶體區域的唯一目的就是存放物件例項,幾乎所有的物件例項都在這裡分配記憶體(有些物件例項在Java虛擬機器棧中分配)。

  • 方法區(Method Area)

方法區與Java堆一樣,是各個執行緒共享的記憶體區域,它用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。

  • 執行時常量池(Runtime Constant Pool)

執行時常量池是方法區的一部分。Class檔案中除了有類的版本、欄位、方法、介面等描述資訊外,還有一項資訊是常量池(Constant Pool Table),用於存放編譯器生成的各種字面量和符號引用,這部分內容將在類載入後進入方法區的執行時常量池中存放。

  • 直接記憶體(Direct Memory)

直接記憶體並不是虛擬機器執行時資料區的一部分,也不是Java虛擬機器規範中定義的記憶體區域。