01_JVM與Java體系結構

前言

推薦學習官方書籍,首推周志明老師出版的《深入理解》Java虛擬機器

01_JVM與Java體系結構

01_JVM與Java體系結構

01_JVM與Java體系結構

01_JVM與Java體系結構

Java及JVM簡介

1。Java是跨平臺語言

不同平臺只要安裝了JVM就可以執行位元組碼檔案

01_JVM與Java體系結構

2。JVM是跨語言的平臺

只要將不同的語言編譯成JVM能識別的位元組碼檔案就能執行

01_JVM與Java體系結構

如果想真正理解虛擬機器的工作原理,就自己編寫一個簡單的虛擬機器

01_JVM與Java體系結構

3。java發生的重大事件

4。Java虛擬機器

作用:

Java虛擬機器就是二進位制位元組碼的執行環境,負責裝載位元組碼到其內部,解釋/編譯為對應平臺上的機器指令執行。

特點

一次編譯,到處執行

自動記憶體管理

自動垃圾回收功能

自動記憶體管理和自動垃圾回收機制帶來的問題

弱化了開發人員處理記憶體和垃圾回收的能力,從而形成了如容導致記憶體溢位的問題和程式碼最佳化的問題

JVM所處位置

01_JVM與Java體系結構

Java8的結構圖

01_JVM與Java體系結構

5。JVM的整體結構

01_JVM與Java體系結構

HotSpot VM是目前市面上高效能虛擬機器代表之一

它採用直譯器和即時編譯器並存的架構

方法區和堆是所有執行緒共享的區域,Java棧(虛擬機器棧)、本地方法棧和程式計數器是執行緒私有的

執行引擎:是將class檔案翻譯成機器指令

6。Java程式碼執行流程

執行引擎包含兩部分

翻譯位元組碼(解析執行),保證響應時間,系統一啟動就對位元組碼進行逐行解析執行

JIT編譯器(編譯執行),針對位元組碼指令,對要反覆執行的程式碼,一般稱為熱點程式碼,JIT將熱點程式碼編譯成機器指令並放到方法區(1。8後叫元空間)快取起來

JIT即時編譯,將熱點程式碼翻譯成機器指令並在本地快取起來,提高程式的反應速度。如果JVM一開始就將所有位元組碼都翻譯成機器指令,需要花費過長的時間,從而導致暫停時間過長,會讓程式有段時間出現卡頓現象。為了讓暫停時間比較短,就要用到了直譯器進行解釋執行,因為直譯器響應速度快,逐行解釋執行位元組碼。

01_JVM與Java體系結構

01_JVM與Java體系結構

01_JVM與Java體系結構

7。JVM的架構模型

Java編譯器輸入的指令流基本上是一種基於

棧的指令集架構

,另外一種指令集架構則是基於

暫存器的指令集架構。

具體來說,這兩種架構之間的區別:

基於棧式架構的特點:

設計和實現更簡單,適用於資源受限的系統。

避開了暫存器的分配難題,使用零地址指令方式分配。

指令流中的指令大部分是零地址指令,其執行過程依賴於操作棧。指令集更小,編譯器容易實現。

不需要硬體支援,可移植性更好,更好的實現跨平臺。

基於暫存器架構的特點:

典型的應用是x86的二進位制指令集;比如傳統的PC以及Android的Davlik虛擬機器。

指令集架構則完全依賴硬體,可移植性差。

效能優秀和執行更高效。

花費更少的指令去完成一項操作。

在大部分情況下,基於暫存器架構的指令集往往都以一地址指令、二地址指令和三地址指令為主,而基於棧式架構的指令集卻是以零地址指令為主。

01_JVM與Java體系結構

Java程式碼示例:

01_JVM與Java體系結構

01_JVM與Java體系結構

01_JVM與Java體系結構

運算元棧中的操作過程示例

01_JVM與Java體系結構

JVM的架構模型總結:

由於跨平臺性的設計,Java的指令都是根據棧來設計的。

不同平臺CPU架構不同,所以不能設計為基於暫存器的架構。優點是跨平臺,指令集小(棧指令集是大概8個位元組,暫存器一般是16個位元組),編譯器容易識別實現,缺點是效能下降,實現同樣的功能需要更多的指令。

時至今日,儘管嵌入式平臺已經不是Java程式的主流執行平臺(準確來說應該是HotSpotVM的宿主機環境已經不侷限於嵌入式平臺了),那麼為什麼不將架構更換為基於暫存器的架構呢?主要是基於棧式架構的優勢來權衡的

棧:

跨平臺性、指令集小、指令多、執行效能比暫存器差

暫存器:

跟硬體耦合度高,可移植性差

8。JVM的生命週期

主要有三個狀態:啟動、執行、退出

虛擬機器啟動

Java虛擬機器的啟動是透過引導類載入器(bootstrap class loader)建立一個初始化類(initial class)來完成的,這個類是由虛擬機器(不同的虛擬機器實現不同)的具體實現指定的。

虛擬機器的執行

一個執行中的Java虛擬機器有著一個清晰的任務:執行Java程式。

程式開始執行時它才執行,程式結束時它就停止。

執行一個所謂的Java程式的時候,真真正正在執行的時一個叫做Java虛擬機器的程序。

虛擬機器的退出

有如下幾種情況:

程式經常執行結束

程式在執行過程中遇到了異常或者錯誤而異常終止

由於作業系統出現錯誤而導致Java虛擬機器程序終止

某執行緒呼叫Runtime類或System類的exit方法,或Runtime類的halt方法,並且Java安全管理器也允許這次exit或halt操作。

除此之外,JNI(Java Native Interface)規範描述了用JNI Invocation API來載入或解除安裝 Java虛擬機器時,Java虛擬機器的退出情況。

JVM發展歷程

1996年Java1。0版本,Sun公司釋出Sun ClassicVM的Java虛擬機器,世界上第一款商用Java虛擬機器,在JDK1。4時被淘汰

Exact VM,jdk1。2時,sun提供的虛擬機器

HotSpot VM jdk1。3到至今都在使用的虛擬機器,Oracle JDK和OpenJDK的預設虛擬機器

BEA的JRockit(2008年BEA被oracle收購了)專注於伺服器端應用,其內部不包含直譯器的實現,JRockit JVM是世界上最快的JVM

IBM 的 J9

TaoBaoJVM 由AliJVM團隊釋出。

是基於OpenJDK HotSpot VM釋出的國內第一個最佳化、深度定製且開源的高效能伺服器版Java虛擬機器。