1. 程式人生 > 其它 >java記憶體區域——執行時資料區域

java記憶體區域——執行時資料區域

根據《java虛擬機器規範》,Java執行時管理的記憶體區域包括以下幾個執行時資料區域:

程式計數器:程式計數器是一塊較小的記憶體,它可以看作是當前執行緒執行的位元組碼行號指示器。位元組碼直譯器工作時就是通過計數器來選擇需要執行的下一條位元組碼執行指令。由於Java虛擬機器的的多執行緒是通過執行緒的輪流切換,分配處理器執行時間實現的。在任何一個時刻,一個處理器都只會執行一條執行緒,所以每個執行緒都需要擁有各自的程式計數器,相互之前互不影響,獨立儲存。這種記憶體區域稱之為“執行緒私有”的。此區域是唯一一個在《java虛擬機器規範》中沒有OutOfMemoryError情況的區域。

虛擬機器棧

:Java虛擬機器棧也是執行緒私有的。java虛擬機器棧描述的是方法執行的執行緒記憶體模型:每個方法被執行時,Java虛擬機器都會同步建立一個棧幀,用於儲存方法的區域性變量表、運算元棧、動態連線,方法出口等資訊。每一個方法從呼叫直至執行完畢,都對應著這個棧幀在虛擬機器棧的入棧與出棧。這個區域規定了兩類異常情況:當執行緒請求的棧深度大於虛擬機器允許的深度,會丟擲StackOverflowError;如果棧容量可以動態擴充套件,當擴充套件時無法申請到足夠的記憶體會丟擲OutOfMemoryError異常。

本地方法棧:本地方法棧的作用與虛擬機器棧的作用是相似的。區別是本地方法棧為虛擬機器使用本地方法服務。它同虛擬機器棧一樣也會對應的出現StackOverflowError和OutofMemoryError異常。

方法區:此區域是執行緒所共享的區域。它用於儲存已被虛擬機器載入的常量,靜態變數,型別資訊,即時編譯器編譯後的程式碼快取等資料。根據《java虛擬機器規範》,當方法區無法滿足新的記憶體分配需求時,會丟擲OutOfMemoryError異常。

java堆:此區域是執行緒所共享的區域。對於java程式而言,這一區域是Java虛擬機器所管理的最大的一塊記憶體。此記憶體的唯一目的是存放物件例項。根據《Java虛擬機器規範》,此區域可以是物理上不連續的記憶體空間中,但是在邏輯上被視為連續的。當堆無法擴充套件時,會丟擲OutOfMemoryError異常。

參考:《深入理解Java虛擬機器》第三版——周志明