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

最好的安排發表於2017-09-05

概述

    java虛擬機器在執行java程式的時候會把它所管理的記憶體分為若干個不同的區域,每個區域有不同的功能、以及建立和銷燬時間,有些區域隨著虛擬機器的啟動而存在,有些區域隨使用者執行緒的啟動和結束建立和銷燬。
java記憶體區域-執行時資料區

1. 程式計數器:

    程式計數器佔用的記憶體比較小,它是當前執行緒所執行的位元組碼的行號指示器,位元組碼直譯器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令。分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器完成。
    該記憶體空間是執行緒私有的,多執行緒是通過執行緒輪流切換並分配處理器執行時間的方式來實現的,同一時間處理器只會處理單個執行緒的指令,每個執行緒都需要記錄本執行緒當前執行的位元組碼指令位置,各個執行緒之間互不影響,獨立儲存。
    如果執行緒執行的是java方法,則這個計數器記錄的是正在執行的虛擬機器位元組碼指令的地址;如果java虛擬機器執行的是Native方法,則計數器的值為空。該記憶體區域為虛擬機器中唯一沒有OutOfMemoryError的區域。

2. java虛擬機器棧:

特點:執行緒私有
生命週期:和執行緒相同,隨著執行緒的建立而產生,執行緒執行結束而回收
內部結構:以棧幀的形式執行和儲存資料,每個方法執行的同時會建立棧幀,用於儲存區域性變數表(this, 方法引數),運算元棧(java是基於棧的執行引擎,其實說的就是運算元棧,用於執行java位元組碼指令)、動態連線(程式碼執行期間將符號引用轉換成直接引用)和方法出口(記錄返回到方法被呼叫的位置)等資訊。每個方法的呼叫到執行完成對過程對應的是棧幀在虛擬機器中入棧和出棧的過程。
異常: StackOverflowError:執行緒請求的棧深度大於虛擬機器所允許的棧深度
       OutOfMemoryError:如果java虛擬機器棧在動態擴充套件到時候無法申請到足夠的記憶體

3. 本地方法棧:

    和java虛擬機器棧的作用是相似的,只是java虛擬機器棧呼叫的是java方法,本地方法棧則是java虛擬機器使用到Native方法服務。

4. java堆

簡單介紹: 所有的物件都需要在該記憶體區域儲存。該區域是所有執行緒共享的,java虛擬機器記憶體管理中最大的一塊記憶體空間。垃圾收集器管理的主要區域,可分為Eden空間、Form Survivor空間、To Suivivor空間。
異常資訊: 如果堆中沒有足夠的記憶體區域完成物件的記憶體分配,則會丟擲OutOfMemoryError一次。

5. 方法區:

特點: 執行緒共享
儲存資訊:

  • 類資訊:
    • 型別全限定名。
    • 型別的直接超類的全限定名(除非這個型別是java.lang.Object,它沒有超類)。
    • 型別是類型別還是介面型別。
    • 型別的訪問修飾符(public、abstract或final的某個子集)。
    • 任何直接超介面的全限定名的有序列表。
    • 型別的常量池。
    • 欄位資訊。
    • 方法資訊。
    • 除了常量意外的所有類(靜態)變數。
    • 一個到類ClassLoader的引用。
    • 一個到Class類的引用。
  • 常量:final
  • 靜態變數:類變數,static
  • 即時編譯器編譯後的程式碼:xxx
  • 執行時常量池:儲存編譯期生成的各種字面量和符號引用

相關文章