1. 程式人生 > >執行時資料區域

執行時資料區域

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

1、程式計數器

    程式計數器是一塊較小的記憶體空間,它可以看作是當前執行緒所執行的位元組碼的行號指示器。

    特點:

       A、位元組碼直譯器工作時需要通過改變計數器的值來選擇下一條需要執行的位元組碼指令。

       B、分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來完成。

       C、各條執行緒之間計數器互不影響,獨立儲存。即“執行緒私有”的記憶體。

2、Java虛擬機器棧

      虛擬機器棧描述的是java方法執行的記憶體模型,每個方法在執行的同時都會建立一個棧幀用於儲存區域性變量表、運算元棧、動態連結、方法出口等資訊。

運算元棧,Java虛擬機器的解釋執行引擎,是被組織成一個以字長為單位的陣列。

動態連結是指編譯系統在連結階段並不把目標檔案和函式庫檔案連結在一起,而是等到程式在執行過程中需要使用時才連結函式庫。

   特點:

      A、執行緒私有

      B、生命週期與執行緒相同

    區域性變量表:存放了編譯期可知的各種基本資料型別(boolean、byte、char、short、int、float、long、double)、物件引用、returnAddress型別(指向了一條位元組碼指令的地址),是一組變數值儲存空間,用於存放方法引數和方法內部定義的區域性變數。。

   物件引用:它不等同於物件本身,可能是一種指向物件起始地址的引用指標,也可能是指向一個代表物件的控制代碼或其他與此物件相關的位置。

異常狀況:

A、 執行緒請求的棧深度大於虛擬機器所允許的深度,就丟擲Stack Overflow Error.

B、虛擬機器可以動態擴充套件,如果擴充套件時無法申請到足夠的記憶體,就會丟擲OutOfMemoryError異常

3、本地方法棧

虛擬機器棧與本地方法棧的區別:

    虛擬機器棧:為虛擬機器執行Java方法(位元組碼)服務

   本地方法棧:為虛擬機器使用到的Native方法服務

4、java堆

     Java堆是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動時建立。此記憶體區域的唯一目的就是存放物件例項,幾乎所有的物件例項都在這裡分配記憶體。所有的物件例項以及陣列都要在堆上分配,但不絕對。是垃圾收集器管理的主要區域。

 

5、方法區

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

 

6、執行時常量池

   是方法區的一部分。

  常量池:用於存放編譯期生成的各種字面量和符號引用,這部分內容分將在類載入後進入方法區的執行時常量中存放。

  字面量:比較接近java語言層面的常量概念,如文字字串、宣告為final的常量值等。

  符號引用:屬於編譯原理方面的概念,包括了下面三類常量:

     A、類和介面的全限定名 B、欄位的名稱和描述符 C、方法的名稱和描述符

7、直接記憶體

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

 

本小節主要介紹一下名詞概念,對於不當的地方,歡迎指教和溝通