JVM 內存結構

jvm 內存結構

graph TB A(jvm)-->E(類加載器系統) A-->B(運行時數據區) A-->D(本地庫接口) A-->C(執行引擎) B-->虛擬機棧 B-->本地方法棧 B-->堆區 B-->方法區 B-->程序計數器

運行時數據區

從整個計算機內存中開闢一塊內存存儲 jvm 運行時須要用到的對象,變量等java

虛擬機棧

  1. 線程私有
  2. 服務於方法
  3. 用於存儲局部變量表、操做數棧、動態連接、方法出口等信息

本地方法棧

  1. 線程私有
  2. 爲虛擬機調用 Native 方法服務

堆區

  1. 線程共享
  2. 存儲對象實例,是虛擬機中內存最大的一塊
  3. 分爲年輕代、年老代、持久代(JDK8 中廢棄),年輕代用來存放新對象,當對象存活時間夠長時,移動到年老代

方法區

  1. 線程共享
  2. 用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯後的代碼等數據
  3. jdk7 及以往版本,方法區基於堆的永久代實現,理論上是堆的一部分
  4. jdk8 取消了永久代,在本地內存中劃分區域-元空間,不屬於 JVM 內存,方法區位於元空間中
  5. 包括運行時常量池和 class 文件常量池

程序計數器

  1. 線程私有
  2. 是當前線程所執行的字節碼的行號指示器
  3. 字節碼解析器的工做是經過改變這個計數器的值,來選取下一條須要執行的字節碼指令
  4. 分支、循環、跳轉、異常處理、線程恢復等基礎功能,都須要依賴這個計數器來完成

執行引擎

  1. 解釋器:解釋執行通過編譯後生成的字節碼文件
  2. 即時編譯器 JIT: 收集一些代碼的執行信息(預熱過程)以後,將頻繁執行的代碼(熱點代碼)直接編譯成本地機器碼
  3. 垃圾收集器:java 虛擬機自動進行內存管理,根據垃圾收集算法,清理無用對象

本地庫接口

  1. 本地接口的做用是融合不一樣的編程語言爲 Java 所用,它的初衷是融合 C/C++ 程序,Java 誕生的時候 C/C++ 橫行,要想立足,必須能夠調用 C/C++ 程序,因而就在內存中專門開闢了一塊區域處理標記爲 native 的代碼
  2. 它的具體做法是 Native Method Stack 中登記 native 方法,在 Execution Engine 執行時加載本地方法庫
  3. 目前該方法使用的愈來愈少了,除非是與硬件有關的應用,好比經過 Java 程序驅動打印機,或者 Java 系統管理生產設備,在企業級應用中已經比較少見。由於如今的異構領域間的通訊很發達,好比能夠使用 Socket 通訊,也能夠使用 Web Service 等

類加載器系統

  1. 負責加載字節碼文件,class 文件在文件開頭有特定的文件標示,而且 ClassLoader 負責 class 文件的加載等,至於它是否能夠運行,則由 Execution Engine 決定
  2. 主要功能
    • 定位和導入二進制 class 文件
    • 驗證導入類的正確性
    • 爲類分配初始化內存
    • 幫助解析符號引用
相關文章
相關標籤/搜索