Java虛擬機01-JAVA體系結(jié)構(gòu)

JAVA 技術(shù)體系

  • JDK 即為 Java 開發(fā)工具包,包含編寫 Java 程序所必須的編譯、運行等開發(fā)工具以及 JRE

  • JRE 即為 Java 運行環(huán)境,提供了運行 Java 應(yīng)用程序所必須的軟件環(huán)境,包含有 Java 虛擬機(JVM)和豐富的系統(tǒng)類庫。系統(tǒng)類庫即為 Java 提前封裝好的功能類,只需拿來直接使用即可,可以大大的提高開發(fā)效率。

  • JVM 即為 Java 虛擬機,提供了字節(jié)碼文件(.class)的運行環(huán)境支持。

技術(shù)體系.png

JAVA 運行流程

JAVA 運行流程.gif
  • 首先我們需要并通過Java編譯器將Java源代碼.java文件編譯為.class文件。.class文件包含了JVM虛擬機所能識別的指令序列,也稱 Java 字節(jié)碼。

  • JAVA虛擬機通過類加載器將.class文件中Java 字節(jié)碼將加載到Java虛擬機中內(nèi)存中。加載后的Java 字節(jié)碼會被存放于方法區(qū)(MethodArea)中。實際運行時,JAVA虛擬機能夠以正確方式讀取執(zhí)行方法區(qū)內(nèi)每一條字節(jié)碼指令。

  • 在HotSpot 里面,上述翻譯過程有兩種形式:第一種是解釋執(zhí)行,即逐條將字節(jié)碼翻譯成機器碼并執(zhí)行;第二種是即時編譯(Just-In-Time compilation,JIT),即將一個方法中包含的所有字節(jié)碼編譯成機器碼后再執(zhí)行。

  • 由于JVM虛擬機是運行在操作系統(tǒng)之上的,Java字節(jié)碼無法直接執(zhí)行。因此Java 虛擬機需要將字節(jié)碼翻譯成機器碼,在通過操作系統(tǒng)轉(zhuǎn)換為指令集調(diào)用底層硬件服務(wù)執(zhí)行。

Java 要在虛擬機里運行

  • Java 虛擬機可以由硬件實現(xiàn),但更為常見的是在各個現(xiàn)有平臺(如 Windows_x64、Linux_aarch64)上提供軟件實現(xiàn)。這么做的意義在于,一旦一個程序被轉(zhuǎn)換成 Java 字節(jié)碼,那么它便可以在不同平臺上的虛擬機實現(xiàn)里運行。這也就是我們經(jīng)常說的“一次編寫,到處運行”。
jvm實現(xiàn).gif
  • 虛擬機的另外一個好處是它帶來了一個托管環(huán)境(Managed Runtime)。這個托管環(huán)境能夠代替我們處理一些代碼中冗長而且容易出錯的部分。其中最廣為人知的當(dāng)屬自動內(nèi)存管理與垃圾回收,這部分內(nèi)容甚至催生了一波垃圾回收調(diào)優(yōu)的業(yè)務(wù)。

  • 除此之外,托管環(huán)境還提供了諸如數(shù)組越界、動態(tài)類型、安全權(quán)限等等的動態(tài)檢測,使我們免于書寫這些無關(guān)業(yè)務(wù)邏輯的代碼。

JAVA中分層設(shè)計

Java語言在JVM上的執(zhí)行.gif
  • 從上圖可以發(fā)現(xiàn)Java是運行在JVM之上的。但是Java語言和JVM沒有必然的聯(lián)系。Java語言并不是只能運行在JVM之上,例如Java可以被編譯為本地代碼直接運行在操作系統(tǒng)之上,比如,Linux上的GCJ(GNU Compiler for Java)就可以把Java語言編譯為本地代碼直接執(zhí)行。

  • 同樣的,JVM上也不是只能執(zhí)行Java語言,只要實現(xiàn)了適當(dāng)?shù)木幾g器,將其他語言編譯為JVM上的字節(jié)碼,就可以在JVM上運行。比如,JRuby,Jython以及Groovy等其他JVM語言,都會通過相應(yīng)的編譯器或是解釋器轉(zhuǎn)化為.class,然后再JVM上運行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容