jvm 內存結構
graph TB A(jvm)-->E(類加載器系統) A-->B(運行時數據區) A-->D(本地庫接口) A-->C(執行引擎) B-->虛擬機棧 B-->本地方法棧 B-->堆區 B-->方法區 B-->程序計數器
運行時數據區
從整個計算機內存中開闢一塊內存存儲 jvm 運行時須要用到的對象,變量等java
虛擬機棧
- 線程私有
- 服務於方法
- 用於存儲局部變量表、操做數棧、動態連接、方法出口等信息
本地方法棧
- 線程私有
- 爲虛擬機調用 Native 方法服務
堆區
- 線程共享
- 存儲對象實例,是虛擬機中內存最大的一塊
- 分爲年輕代、年老代、持久代(JDK8 中廢棄),年輕代用來存放新對象,當對象存活時間夠長時,移動到年老代
方法區
- 線程共享
- 用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯後的代碼等數據
- jdk7 及以往版本,方法區基於堆的永久代實現,理論上是堆的一部分
- jdk8 取消了永久代,在本地內存中劃分區域-元空間,不屬於 JVM 內存,方法區位於元空間中
- 包括運行時常量池和 class 文件常量池
程序計數器
- 線程私有
- 是當前線程所執行的字節碼的行號指示器
- 字節碼解析器的工做是經過改變這個計數器的值,來選取下一條須要執行的字節碼指令
- 分支、循環、跳轉、異常處理、線程恢復等基礎功能,都須要依賴這個計數器來完成
執行引擎
- 解釋器:解釋執行通過編譯後生成的字節碼文件
- 即時編譯器 JIT: 收集一些代碼的執行信息(預熱過程)以後,將頻繁執行的代碼(熱點代碼)直接編譯成本地機器碼
- 垃圾收集器:java 虛擬機自動進行內存管理,根據垃圾收集算法,清理無用對象
本地庫接口
- 本地接口的做用是融合不一樣的編程語言爲 Java 所用,它的初衷是融合 C/C++ 程序,Java 誕生的時候 C/C++ 橫行,要想立足,必須能夠調用 C/C++ 程序,因而就在內存中專門開闢了一塊區域處理標記爲 native 的代碼
- 它的具體做法是 Native Method Stack 中登記 native 方法,在 Execution Engine 執行時加載本地方法庫
- 目前該方法使用的愈來愈少了,除非是與硬件有關的應用,好比經過 Java 程序驅動打印機,或者 Java 系統管理生產設備,在企業級應用中已經比較少見。由於如今的異構領域間的通訊很發達,好比能夠使用 Socket 通訊,也能夠使用 Web Service 等
類加載器系統
- 負責加載字節碼文件,class 文件在文件開頭有特定的文件標示,而且 ClassLoader 負責 class 文件的加載等,至於它是否能夠運行,則由 Execution Engine 決定
- 主要功能
- 定位和導入二進制 class 文件
- 驗證導入類的正確性
- 爲類分配初始化內存
- 幫助解析符號引用