1. 程式人生 > >Jvm--01、Jvm記憶體結構

Jvm--01、Jvm記憶體結構

HotSpot VM,它是Sun JDK和OpenJDK中所帶的虛擬機器,也是目前使用範圍最廣的Java虛擬機器。

話不多說上圖、Jvm記憶體結構圖:

深入理解Java虛擬機器(第二版)如圖: 

 

 方法區和堆是執行緒共享的、所有會有執行緒安全的問題。

1、Java堆(java heap)()

1、概述
 java堆是java虛擬機器所管理的記憶體中最大的一塊,是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動時建立。
此記憶體區域的唯一目的就是存放物件例項,這一點在Java虛擬機器規範中的描述是:所有的物件例項以及陣列都要在堆上分配。 

2、只存放物件本身、引用型別

2、java虛擬機器棧(java virtual machine stacks)

1、概述
java虛擬機器棧也是執行緒私有的,它的生命週期和執行緒相同。虛擬機器棧描述的是Java方法執行的記憶體模型:
每個方法在執行的同時都會建立一個棧幀(Stack Frame)用於儲存區域性變量表、運算元棧、動態連結、方法出口等資訊。
棧中只儲存基礎資料型別的物件和自定義物件的引用、每個棧中的資料(原始型別和物件引用)都是私有的,其他棧不能訪問

2、棧中只儲存 基礎資料型別、區域性變數、和自定義物件的引用(不是物件)

3、本地方法棧(Native Method Stack)

1、概述
本地方法棧與虛擬機器棧所發揮作用非常相似,它們之間的區別不過是虛擬機器棧為虛擬機器執行Java方法
(也就是位元組碼)服務,而本地方法棧則為虛擬機器使用到的native方法服務。本地方法棧也是丟擲兩個異常

2、本地方法棧:java語言呼叫外部語言(C語言)方法使用native、安卓開發--應用層java api和底層C語言通訊(JNI)

4、方法區

1、概述
方法區與java堆一樣,是各個執行緒共享的記憶體區域,、即時編譯器編譯後的程式碼等資料。
它有個別命叫Non-Heap(非堆)。當方法區無法滿足記憶體分配需求時,丟擲OutOfMemoryError異常。

2、儲存已被虛擬機器 載入的類資訊、常量、靜態變數、常量池

5、直接記憶體(DirectMemory)

直接記憶體不是虛擬機器執行時資料區的一部分,也不是java虛擬機器規範中定義的記憶體區域。
但這部分割槽域也唄頻繁使用,而且也可能導致OutOfMemoryError異常

6、執行時常量池(Runtime Constant Pool)

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

7、程式計數器(Program Counter Register)

程式計數器是一塊較小的記憶體空間,它可以看作是當前執行緒所執行的位元組碼的行號指示器。
由於Java虛擬機器的多執行緒是通過執行緒輪流切換並分配處理器執行時間的方式來實現的,一個處理器都只會執行一條
執行緒中的指令。因此,為了執行緒切換後能恢復到正確的執行位置,每條執行緒都有一個獨立的程式計數器,各個執行緒
之間計數器互不影響,獨立儲存。稱之為“執行緒私有”的記憶體。程式計數器記憶體區域是虛擬機器中唯一沒有規定OutOfMemoryError情況的區域。

8、執行引擎

虛擬機器核心的元件就是執行引擎,它負責執行虛擬機器的位元組碼

9、垃圾收集系統

垃圾收集系統是Java的核心,也是不可少的,Java有一套自己進行垃圾清理的機制,開發人員無需手工清理