1. 程式人生 > >JVM執行時記憶體區域

JVM執行時記憶體區域

java虛擬機器在執行java程式的過程中,會把自己所管理的記憶體劃分為幾個不同的區域。每個區域的作用不同,建立和銷燬的時間也不同。java虛擬機器所管理的記憶體分為以下幾個執行時區域:

這裡寫圖片描述

方法區

方法區(Method Area)是被所有執行緒共享區域,用於存放已被JVM載入的類資訊、常量、靜態變數、即時編譯
器編譯後的程式碼等資料。(對應JVM記憶體配置中的-PermSize等)。
方法區中包含執行時常量池(Runtime Constant Pool)。Class檔案中除了類的版本、欄位、方法、介面等描述
資訊外,還包含常量池,用於存放編譯器生成的符號引用等,這部分內容將在類載入後存放在執行時常量池中。
java語言並不要求常量一定只有編譯器才能產生,執行期間也可能將新的常量放入池中。常量池在無法申請到內
存是會丟擲OutOfMemoryError異常。

java堆

堆也是被所有執行緒共享的一塊區域,在虛擬機器啟動時建立。java堆的唯一目的就是存放物件例項,幾乎所有的對
象例項都在java堆中分配記憶體。同時也包括陣列。java堆是垃圾收集器管理的主要區域,因此,有的時候 也被稱
為GC堆(對應JVM記憶體配置中的-Xms和-Xmx等)。如果堆中沒有記憶體完成例項分配,並且也無法擴充套件記憶體時,
將丟擲丟擲OutOfMemoryError異常。

java虛擬機器棧

執行緒私有,它的生命週期同線程相同。每個方法執行的同時都會建立一個棧幀用於儲存區域性變量表、運算元棧、
動態連結、方法出口等資訊。一個Java方法從呼叫到執行完的過程,就對應著一個棧幀從虛擬機器棧入棧到出棧
的過程(對應JVM記憶體配置中的-Xss)。在java虛擬機器規範中,對這個區域規定了2中異常情況:如果執行緒請求的
棧深度大於虛擬機器所允許的深度,將丟擲StackOverflowError異常。如果擴充套件時無法申請到足夠的記憶體,就會
丟擲OutOfMemoryError異常。

本地方法棧

本地方法棧類似與虛擬機器棧,它們不同之處在於,虛擬機器棧是為虛擬機器執行的Java方法服務,而本地方法棧是為
虛擬機器使用到的Native方法服務;當JVM執行緒呼叫了本地方法, 則會跳入本地方法棧。本地方法返回後可能再次
跳回java方法棧。與虛擬機器棧一樣,本地方法棧會丟擲StackOverflowError、OutOfMemoryError異常。

程式計數器

每個執行緒擁有自己獨立的程式計數器,它指向正在執行的虛擬機器位元組碼指令地址。當執行緒呼叫本地方法的時候, 它為undefined。此記憶體區域是唯一一個沒有OutOfMemeryError情況的區域。