1. 程式人生 > >【玩轉jvm系列 01】Java虛擬機器的基本結構

【玩轉jvm系列 01】Java虛擬機器的基本結構

Java虛擬機器架構圖

image

Java虛擬機器基本結構思維導圖

image

類載入子系統

  • 類載入子系統負責從檔案系統或者網路中載入Class資訊,載入的類資訊存放於一塊稱為方法區的記憶體空間。

Java堆

  • Java堆是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動時建立。此記憶體區域的唯一目的就是存放物件例項,幾乎所有的物件例項都在這裡分配記憶體。
  • 對於絕大多數應用,Java堆是Java虛擬機器所管理的記憶體中最大的一塊。
  • Java堆是垃圾收集器管理的主要區域,因此也被稱為“GC堆”。
  • Java堆可以處於物理上不連續的記憶體空間中,只要邏輯上連續即可。
  • 在實現時,既可以實現成固定大小的,也可以是可擴充套件的,主流虛擬機器都是按照可擴充套件的(通過-Xmm和-Xms控制)。
  • 如果在堆中沒有記憶體完成例項分配,並且堆也無法再擴充套件,將會丟擲OutOfMemoryError異常。

Java虛擬機器棧(Java棧)

  • Java虛擬機器棧是執行緒私有的,它的生命週期與執行緒相同。
  • 每個方法在執行的同時會建立一個棧幀,用於儲存區域性變量表、運算元棧、動態連結、方法出口等資訊。
  • Java棧中儲存著區域性變數、方法引數,同時和Java方法的呼叫、返回密切相關。
  • 如果執行緒請求的棧深度大於虛擬機器所允許的深度,將丟擲StackOverflowError異常。

本地方法棧

  • 本地方法棧與虛擬機器棧所發揮的作用非常類似,最大的不同在於虛擬機器棧用於Java方法的呼叫,而本地方法棧則用於本地方法的呼叫。

程式計數器(PC暫存器)

  • 程式計數器是一塊較小的記憶體空間,可以看做是當前執行緒的位元組碼的行號指示器。
  • 程式計數器也是每個執行緒私有的空間,Java虛擬機器會為每個Java執行緒建立程式計數器。
  • 如果執行緒正在執行的是一個Java方法,這個計數器記錄的是正在執行的虛擬機器位元組碼指令地址;如果正在執行的是Native方法,這個計數器值則為空(Undefined)。
  • 此記憶體區域是唯一一個再Java虛擬機器規範中沒有規定任何OutOfMemoryError情況的區域。

方法區

  • 方法區是各個執行緒共享的記憶體區域。
  • 用於儲存被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。
  • 它有一個別名叫做Non-Heap(非堆),用於與Java堆的區分。
  • 可以選擇不實現垃圾收集。

執行時常量池

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

垃圾回收系統

  • 垃圾回收器可以對方法區、Java堆和直接記憶體進行回收。
  • Java堆是垃圾收集器的工作重點。

執行引擎

  • 負責執行虛擬機器的位元組碼。

直接記憶體

  • 直接記憶體並不是虛擬機器執行時資料區的一部分,也不是Java虛擬機器規範中定義的記憶體區域。
  • 直接記憶體的分配不會受到Java堆大小的限制,但是會受到本機總記憶體以及處理器定址空間的限制。
  • 訪問直接記憶體的速度會優於Java堆。因此,在讀寫頻繁的場合可能會考慮直接使用直接記憶體。

 

呆萌鍾, 版權所有丨如未註明 , 均為原創丨本網站採用BY-NC-SA協議進行授權 , 轉載請註明【玩轉jvm系列 01】Java虛擬機器的基本結構!