JVM虚拟机详解(一)JVM与JAVA体系统结构
JVM虛擬機(jī)詳解(一)JVM與JAVA體系統(tǒng)結(jié)構(gòu)
1. Java生態(tài)圈
Java是目前應(yīng)用最為廣泛的軟件開發(fā)平臺(tái)之一。隨著Java以及Java社區(qū)的不斷壯大Java 也早已不再是簡(jiǎn)簡(jiǎn)單單的一門計(jì)算機(jī)語(yǔ)言了,它更是一個(gè)平臺(tái)、一種文化、一個(gè)社區(qū)。
- 作為一個(gè)平臺(tái),Java虛擬機(jī)扮演著舉足輕重的作用
- Groovy、Scala、JRuby、Kotlin等都是Java平臺(tái)的一部分
- 作為燈種文化,Java幾乎成為了“開源”的代名詞。
- 第三方開源軟件和框架。如Tomcat、Struts,MyBatis,Spring等。
- 就連JDK和JVM自身也有不少開源的實(shí)現(xiàn),如openJDK、Harmony。
- 作為一個(gè)社區(qū),Java擁有全世界最多的技術(shù)擁護(hù)者和開源社區(qū)支持,有數(shù)不清的論壇和資料。從桌面應(yīng)用軟件、嵌入式開發(fā)到企業(yè)級(jí)應(yīng)用、后臺(tái)服務(wù)器、中間件,都可以看到Java的身影。其應(yīng)用形式之復(fù)雜、參與人數(shù)之眾多也令人咋舌。
隨著Java7的正式發(fā)布,Java虛擬機(jī)的設(shè)計(jì)者們通過JSR-292規(guī)范基本實(shí)現(xiàn)在Java虛擬機(jī)平臺(tái)上運(yùn)行非Java語(yǔ)言編寫的程序。
Java虛擬機(jī)根本不關(guān)心運(yùn)行在其內(nèi)部的程序到底是使用何種編程語(yǔ)言編寫的,它只關(guān)心“字節(jié)碼”文件。也就是說Java虛擬機(jī)擁有語(yǔ)言無關(guān)性,并不會(huì)單純地與Java語(yǔ)言“終身綁定”,只要其他編程語(yǔ)言的編譯結(jié)果滿足并包含Java虛擬機(jī)的內(nèi)部指令集、符號(hào)表以及其他的輔助信息,它就是一個(gè)有效的字節(jié)碼文件,就能夠被虛擬機(jī)所識(shí)別并裝載運(yùn)行。
2. 字節(jié)碼
我們平時(shí)說的java字節(jié)碼,指的是用java語(yǔ)言編譯成的字節(jié)碼。準(zhǔn)確的說任何能在jvm平臺(tái)上執(zhí)行的字節(jié)碼格式都是一樣的。所以應(yīng)該統(tǒng)稱為:jvm字節(jié)碼。
不同的編譯器,可以編譯出相同的字節(jié)碼文件,字節(jié)碼文件也可以在不同的JVM上運(yùn)行。
Java虛擬機(jī)與Java語(yǔ)言并沒有必然的聯(lián)系,它只與特定的二進(jìn)制文件格式—Class文件格式所關(guān)聯(lián),Class文件中包含了Java虛擬機(jī)指令集(或者稱為字節(jié)碼、Bytecodes)和符號(hào)表,還有一些其他輔助信息。
3. 多語(yǔ)言混合編程
Java平臺(tái)上的多語(yǔ)言混合編程正成為主流,通過特定領(lǐng)域的語(yǔ)言去解決特定領(lǐng)域的問題是當(dāng)前軟件開發(fā)應(yīng)對(duì)日趨復(fù)雜的項(xiàng)目需求的一個(gè)方向。
試想一下,在一個(gè)項(xiàng)目之中,并行處理用clojure語(yǔ)言編寫,展示層使用JRuby/Rails,中間層則是Java,每個(gè)應(yīng)用層都將使用不同的編程語(yǔ)言來完成,而且,接口對(duì)每一層的開發(fā)者都是透明的,各種語(yǔ)言之間的交互不存在任何困難,就像使用自己語(yǔ)言的原生API一樣方便,因?yàn)樗鼈冏罱K都運(yùn)行在一個(gè)虛擬機(jī)之上。
對(duì)這些運(yùn)行于Java虛擬機(jī)之上、Java之外的語(yǔ)言,來自系統(tǒng)級(jí)的、底層的支持正在迅速增強(qiáng),以JSR-292為核心的一系列項(xiàng)目和功能改進(jìn)(如Da Vinci Machine項(xiàng)目、Nashorn引擎、InvokeDynamic指令、java.lang.invoke包等),推動(dòng)Java虛擬機(jī)從“Java語(yǔ)言的虛擬機(jī)”向 “多語(yǔ)言虛擬機(jī)”的方向發(fā)展。
4. Java發(fā)展的重大事件
- 1990年,在Sun計(jì)算機(jī)公司中,由Patrick Naughton、MikeSheridan及James Gosling領(lǐng)導(dǎo)的小組Green Team,開發(fā)出的新的程序語(yǔ)言,命名為oak,后期命名為Java
- 1995年,Sun正式發(fā)布Java和HotJava產(chǎn)品,Java首次公開亮相。
- 1996年1月23日sun Microsystems發(fā)布了JDK 1.0。
- 1998年,JDK1.2版本發(fā)布。同時(shí),sun發(fā)布了JSP/Servlet、EJB規(guī)范,以及將Java分成了J2EE、J2SE和J2ME。這表明了Java開始向企業(yè)、桌面應(yīng)用和移動(dòng)設(shè)備應(yīng)用3大領(lǐng)域挺進(jìn)。
- 2000年,JDK1.3發(fā)布,Java HotSpot Virtual Machine正式發(fā)布,成為Java的默認(rèn)虛擬機(jī)。
- 2002年,JDK1.4發(fā)布,古老的Classic虛擬機(jī)退出歷史舞臺(tái)。
- 2003年年底,Java平臺(tái)的scala正式發(fā)布,同年Groovy也加入了Java陣營(yíng)。
- 2004年,JDK1.5發(fā)布。同時(shí)JDK1.5改名為JavaSE5.0。
- 2006年,JDK6發(fā)布。同年,Java開源并建立了openJDK。順理成章,Hotspot虛擬機(jī)也成為了openJDK中的默認(rèn)虛擬機(jī)。
- 2007年,Java平臺(tái)迎來了新伙伴Clojure。
- 2008年,oracle收購(gòu)了BEA,得到了JRockit虛擬機(jī)。
- 2009年,Twitter宣布把后臺(tái)大部分程序從Ruby遷移到scala,這是Java平臺(tái)的又一次大規(guī)模應(yīng)用。
- 2010年,oracle收購(gòu)了sun,獲得Java商標(biāo)和最真價(jià)值的HotSpot虛擬機(jī)。此時(shí),oracle擁有市場(chǎng)占用率最高的兩款虛擬機(jī)HotSpot和JRockit,并計(jì)劃在未來對(duì)它們進(jìn)行整合:HotRockit
- 2011年,JDK7發(fā)布。在JDK1.7u4中,正式啟用了新的垃圾回收器G1。
- 2017年,JDK9發(fā)布。將G1設(shè)置為默認(rèn)Gc,替代CMS
- 同年,IBM的J9開源,形成了現(xiàn)在的open J9社區(qū)
- 2018年,Android的Java侵權(quán)案判決,Google賠償oracle計(jì)88億美元
- 同年,oracle宣告JavagE成為歷史名詞JDBC、JMS、Servlet贈(zèng)予Eclipse基金會(huì)
- 同年,JDK11發(fā)布,LTS版本的JDK,發(fā)布革命性的zGc,調(diào)整JDK授權(quán)許可
- 2019年,JDK12發(fā)布,加入RedHat領(lǐng)導(dǎo)開發(fā)的shenandoah GC
在JDK11之前,oracleJDK中還會(huì)存在一些openJDK中沒有的、閉源的功能。但在JDK11中,我們可以認(rèn)為openJDK和oracleJDK代碼實(shí)質(zhì)上已經(jīng)完全一致的程度。
5. 虛擬機(jī)與Java虛擬機(jī)
所謂虛擬機(jī)(Virtual Machine),就是一臺(tái)虛擬的計(jì)算機(jī)。它是一款軟件,用來執(zhí)行一系列虛擬計(jì)算機(jī)指令。大體上,虛擬機(jī)可以分為系統(tǒng)虛擬機(jī)和程序虛擬機(jī)。
- 大名鼎鼎的Visual Box,Mware就屬于系統(tǒng)虛擬機(jī),它們完全是對(duì)物理計(jì)算機(jī)的仿真,提供了一個(gè)可運(yùn)行完整操作系統(tǒng)的軟件平臺(tái)。
- 程序虛擬機(jī)的典型代表就是Java虛擬機(jī),它專門為執(zhí)行單個(gè)計(jì)算機(jī)程序而設(shè)計(jì),在Java虛擬機(jī)中執(zhí)行的指令我們稱為Java字節(jié)碼指令。
無論是系統(tǒng)虛擬機(jī)還是程序虛擬機(jī),在上面運(yùn)行的軟件都被限制于虛擬機(jī)提供的資源中。
6. Java虛擬機(jī)
Java虛擬機(jī)是一臺(tái)執(zhí)行Java字節(jié)碼的虛擬計(jì)算機(jī),它擁有獨(dú)立的運(yùn)行機(jī)制,其運(yùn)行的Java字節(jié)碼也未必由Java語(yǔ)言編譯而成。
JVM平臺(tái)的各種語(yǔ)言可以共享Java虛擬機(jī)帶來的跨平臺(tái)性、優(yōu)秀的垃圾回器,以及可靠的即時(shí)編譯器。
Java技術(shù)的核心就是Java虛擬機(jī)(JVM,Java Virtual Machine),因?yàn)樗械腏ava程序都運(yùn)行在Java虛擬機(jī)內(nèi)部。
Java虛擬機(jī)就是二進(jìn)制字節(jié)碼的運(yùn)行環(huán)境,負(fù)責(zé)裝載字節(jié)碼到其內(nèi)部,解釋/編譯為對(duì)應(yīng)平臺(tái)上的機(jī)器指令執(zhí)行。每一條Java指令,Java虛擬機(jī)規(guī)范中都有詳細(xì)定義,如怎么取操作數(shù),怎么處理操作數(shù),處理結(jié)果放在哪里。
特點(diǎn):
- 一次編譯,到處運(yùn)行
- 自動(dòng)內(nèi)存管理
- 自動(dòng)垃圾回收功能
7. JVM的位置
JVM是運(yùn)行在操作系統(tǒng)之上的,它與硬件沒有直接的交互
- Java的體系結(jié)構(gòu)
8. JVM整體結(jié)構(gòu)
- HotSpot VM是目前市面上高性能虛擬機(jī)的代表作之一。
- 它采用解釋器與即時(shí)編譯器并存的架構(gòu)。
- 在今天,Java程序的運(yùn)行性能早已脫胎換骨,已經(jīng)達(dá)到了可以和C/C++程序一較高下的地步。
執(zhí)行引擎包含三部分:解釋器,及時(shí)編譯器,垃圾回收器
9. Java代碼執(zhí)行流程
只是能生成被Java虛擬機(jī)所能解釋的字節(jié)碼文件,那么理論上就可以自己設(shè)計(jì)一套代碼了
10. JVM的架構(gòu)模型
-
在文件中找到Java編譯器輸入的指令流基本上是一種基于棧的指令集架構(gòu),另外一種指令集架構(gòu)則是基于寄存器的指令集架構(gòu)。具體來說:這兩種架構(gòu)之間的區(qū)別:
- 基于棧式架構(gòu)的特點(diǎn)
- 設(shè)計(jì)和實(shí)現(xiàn)更簡(jiǎn)單,適用于資源受限的系統(tǒng);
- 避開了寄存器的分配難題:使用零地址指令方式分配。
- 指令流中的指令大部分是零地址指令,其執(zhí)行過程依賴于操作棧。指令集更小,編譯器容易實(shí)現(xiàn)。
- 不需要硬件支持,可移植性更好,更好實(shí)現(xiàn)跨平臺(tái)
- 基于寄存器架構(gòu)的特點(diǎn)
- 典型的應(yīng)用是x86的二進(jìn)制指令集:比如傳統(tǒng)的PC以及Android的Davlik虛擬機(jī)。
- 指令集架構(gòu)則完全依賴硬件,可移植性差
- 性能優(yōu)秀和執(zhí)行更高效
- 花費(fèi)更少的指令去完成一項(xiàng)操作。
- 在大部分情況下,基于寄存器架構(gòu)的指令集往往都以一地址指令、二地址指令和三地址指令為主,而基于棧式架構(gòu)的指令集卻是以零地址指令為主
兩種架構(gòu)的舉例
同樣執(zhí)行2+3這種邏輯操作,其指令分別如下:
11. 字節(jié)碼反編譯
-
我們編寫一個(gè)簡(jiǎn)單的代碼,然后查看一下字節(jié)碼的反編譯后的結(jié)果
package com.peppa;/*** @author peppa* @create 2022-02-08 15:51:45*/ public class StackStruTest {public static void main(String[] args) {int i = 2 + 3;} } -
然后我們找到編譯后的 class文件,使用下列命令進(jìn)行反編譯
javap -v StackStruTest.class反編譯結(jié)果:
public class com.peppa.StackStruTestminor version: 0major version: 52flags: (0x0021) ACC_PUBLIC, ACC_SUPERthis_class: #5 // com/peppa/StackStruTestsuper_class: #6 // java/lang/Objectinterfaces: 0, fields: 0, methods: 2, attributes: 1 Constant pool:#1 = Methodref #6.#23 // java/lang/Object."<init>":()V#2 = Fieldref #24.#25 // java/lang/System.out:Ljava/io/PrintStream;#3 = String #26 // -----------------#4 = Methodref #27.#28 // java/io/PrintStream.println:(Ljava/lang/String;)V#5 = Class #29 // com/peppa/StackStruTest#6 = Class #30 // java/lang/Object#7 = Utf8 <init>#8 = Utf8 ()V#9 = Utf8 Code#10 = Utf8 LineNumberTable#11 = Utf8 LocalVariableTable#12 = Utf8 this#13 = Utf8 Lcom/peppa/StackStruTest;#14 = Utf8 main#15 = Utf8 ([Ljava/lang/String;)V#16 = Utf8 args#17 = Utf8 [Ljava/lang/String;#18 = Utf8 i#19 = Utf8 I#20 = Utf8 MethodParameters#21 = Utf8 SourceFile#22 = Utf8 StackStruTest.java#23 = NameAndType #7:#8 // "<init>":()V#24 = Class #31 // java/lang/System#25 = NameAndType #32:#33 // out:Ljava/io/PrintStream;#26 = Utf8 -----------------#27 = Class #34 // java/io/PrintStream#28 = NameAndType #35:#36 // println:(Ljava/lang/String;)V#29 = Utf8 com/peppa/StackStruTest#30 = Utf8 java/lang/Object#31 = Utf8 java/lang/System#32 = Utf8 out#33 = Utf8 Ljava/io/PrintStream;#34 = Utf8 java/io/PrintStream#35 = Utf8 println#36 = Utf8 (Ljava/lang/String;)V {public com.peppa.StackStruTest();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 6: 0LocalVariableTable:Start Length Slot Name Signature0 5 0 this Lcom/peppa/StackStruTest;
12. JVM生命周期
-
虛擬機(jī)的啟動(dòng)
Java虛擬機(jī)的啟動(dòng)是通過引導(dǎo)類加載器(bootstrap class loader)創(chuàng)建一個(gè)初始類(initial class)來完成的,這個(gè)類是由虛擬機(jī)的具體實(shí)現(xiàn)指定的。
-
虛擬機(jī)的執(zhí)行
- 一個(gè)運(yùn)行中的Java虛擬機(jī)有著一個(gè)清晰的任務(wù):執(zhí)行Java程序。
- 程序開始執(zhí)行時(shí)他才運(yùn)行,程序結(jié)束時(shí)他就停止。
- 執(zhí)行一個(gè)所謂的Java程序的時(shí)候,真真正正在執(zhí)行的是一個(gè)叫做Java虛擬機(jī)的進(jìn)程。
-
虛擬機(jī)的退出
- 程序正常執(zhí)行結(jié)束
- 程序在執(zhí)行過程中遇到了異常或錯(cuò)誤而異常終止
- 由于操作系統(tǒng)用現(xiàn)錯(cuò)誤而導(dǎo)致Java虛擬機(jī)進(jìn)程終止
- 某線程調(diào)用Runtime類或System類的exit方法,或Runtime類的halt方法,并且Java安全管理器也允許這次exit或halt操作。
- 除此之外,JNI(Java Native Interface)規(guī)范描述了用JNI Invocation API來加載或卸載 Java虛擬機(jī)時(shí),Java虛擬機(jī)的退出情況。
13. JVM發(fā)展歷程
-
Sun Classic VM
- 早在1996年Java1.0版本的時(shí)候,Sun公司發(fā)布了一款名為sun classic VM的Java虛擬機(jī),它同時(shí)也是世界上第一款商用Java虛擬機(jī),JDK1.4時(shí)完全被淘汰。
- 這款虛擬機(jī)內(nèi)部只提供解釋器,沒有即時(shí)編譯器,因此效率比較低。【即時(shí)編譯器會(huì)把熱點(diǎn)代碼的本地機(jī)器指令緩存起來,那么以后使用熱點(diǎn)代碼的時(shí)候,效率就比較高】
- 如果使用JIT編譯器,就需要進(jìn)行外掛。但是一旦使用了JIT編譯器,JIT就會(huì)接管虛擬機(jī)的執(zhí)行系統(tǒng)。解釋器就不再工作,解釋器和編譯器不能配合工作。
- 我們將字節(jié)碼指令翻譯成機(jī)器指令也是需要花時(shí)間的,如果只使用JIT,就需要把所有字節(jié)碼指令都翻譯成機(jī)器指令,就會(huì)導(dǎo)致翻譯時(shí)間過長(zhǎng),也就是說在程序剛啟動(dòng)的時(shí)候,等待時(shí)間會(huì)很長(zhǎng)。
- 而解釋器就是走到哪,解釋到哪。
- 現(xiàn)在Hotspot內(nèi)置了此虛擬機(jī)。
-
Exact VM
- 為了解決上一個(gè)虛擬機(jī)問題,jdk1.2時(shí),Sun提供了此虛擬機(jī)。
- Exact Memory Management:準(zhǔn)確式內(nèi)存管理
- 也可以叫Non-Conservative/Accurate Memory Management
- 虛擬機(jī)可以知道內(nèi)存中某個(gè)位置的數(shù)據(jù)具體是什么類型。
- 具備現(xiàn)代高性能虛擬機(jī)的維形
- 熱點(diǎn)探測(cè)(尋找出熱點(diǎn)代碼進(jìn)行緩存)
- 編譯器與解釋器混合工作模式
- 只在Solaris平臺(tái)短暫使用,其他平臺(tái)上還是classic vm,英雄氣短,終被Hotspot虛擬機(jī)替換
-
HotSpot VM(重點(diǎn))
- HotSpot歷史
- 最初由一家名為“Longview Technologies”的小公司設(shè)計(jì)
- 1997年,此公司被Sun收購(gòu);2009年,Sun公司被甲骨文收購(gòu)。
- JDK1.3時(shí),HotSpot VM成為默認(rèn)虛擬機(jī)
- 目前Hotspot占有絕對(duì)的市場(chǎng)地位,稱霸武林。
- 不管是現(xiàn)在仍在廣泛使用的JDK6,還是使用比例較多的JDK8中,默認(rèn)的虛擬機(jī)都是HotSpot
- Sun/oracle JDK和openJDK的默認(rèn)虛擬機(jī)
- 因此本課程中默認(rèn)介紹的虛擬機(jī)都是HotSpot,相關(guān)機(jī)制也主要是指HotSpot的GC機(jī)制。(比如其他兩個(gè)商用虛機(jī)都沒有方法區(qū)的概念)
- 從服務(wù)器、桌面到移動(dòng)端、嵌入式都有應(yīng)用。
- 名稱中的HotSpot指的就是它的熱點(diǎn)代碼探測(cè)技術(shù)。
- 通過計(jì)數(shù)器找到最具編譯價(jià)值代碼,觸發(fā)即時(shí)編譯或棧上替換
- 通過編譯器與解釋器協(xié)同工作,在最優(yōu)化的程序響應(yīng)時(shí)間與最佳執(zhí)行性能中取得平衡
-
JRockit(商用三大虛擬機(jī)之一)
- 專注于服務(wù)器端應(yīng)用:它可以不太關(guān)注程序啟動(dòng)速度,因此JRockit內(nèi)部不包含解析器實(shí)現(xiàn),全部代碼都靠即時(shí)編譯器編譯后執(zhí)行。
- 大量的行業(yè)基準(zhǔn)測(cè)試顯示,JRockit JVM是世界上最快的JVM:使用JRockit產(chǎn)品,客戶已經(jīng)體驗(yàn)到了顯著的性能提高(一些超過了70%)和硬件成本的減少(達(dá)50%)。
- 優(yōu)勢(shì):全面的Java運(yùn)行時(shí)解決方案組合
- JRockit面向延遲敏感型應(yīng)用的解決方案JRockit Real Time提供以毫秒或微秒級(jí)的JVM響應(yīng)時(shí)間,適合財(cái)務(wù)、軍事指揮、電信網(wǎng)絡(luò)的需要
- Mission Control服務(wù)套件,它是一組以極低的開銷來監(jiān)控、管理和分析生產(chǎn)環(huán)境中的應(yīng)用程序的工具。
- 2008年,JRockit被Oracle收購(gòu)。
- Oracle表達(dá)了整合兩大優(yōu)秀虛擬機(jī)的工作,大致在JDK8中完成。整合的方式是在HotSpot的基礎(chǔ)上,移植JRockit的優(yōu)秀特性。
- 高斯林:目前就職于谷歌,研究人工智能和水下機(jī)器人
-
IBM的J9(商用三大虛擬機(jī)之一)
- 全稱:IBM Technology for Java Virtual Machine,簡(jiǎn)稱IT4J,內(nèi)部代號(hào):J9
- 市場(chǎng)定位與HotSpot接近,服務(wù)器端、桌面應(yīng)用、嵌入式等多用途VM廣泛用于IBM的各種Java產(chǎn)品。
- 目前,有影響力的三大商用虛擬機(jī)之一,也號(hào)稱是世界上最快的Java虛擬機(jī)。
- 2017年左右,IBM發(fā)布了開源J9VM,命名為openJ9,交給Eclipse基金會(huì)管理,也稱為Eclipse OpenJ9
- OpenJDK -> 是JDK開源了,包括了虛擬機(jī)
-
KVM和CDC/CLDC Hotspot
- Oracle在Java ME產(chǎn)品線上的兩款虛擬機(jī)為:CDC/CLDC HotSpot Implementation VM
- KVM(Kilobyte)是CLDC-HI早期產(chǎn)品
- 目前移動(dòng)領(lǐng)域地位尷尬,智能機(jī)被Android和iOS二分天下。
- KVM簡(jiǎn)單、輕量、高度可移植,面向更低端的設(shè)備上還維持自己的一片市場(chǎng)
- 智能控制器、傳感器
- 老人手機(jī)、經(jīng)濟(jì)欠發(fā)達(dá)地區(qū)的功能手機(jī)
- 所有的虛擬機(jī)的原則:一次編譯,到處運(yùn)行。
-
Azul VM
- 前面三大“高性能Java虛擬機(jī)”使用在通用硬件平臺(tái)上
- 這里Azul VW和BEA Liquid VM是與特定硬件平臺(tái)綁定、軟硬件配合的專有虛擬機(jī):高性能Java虛擬機(jī)中的戰(zhàn)斗機(jī)。
- Azul VM是Azul Systems公司在HotSpot基礎(chǔ)上進(jìn)行大量改進(jìn),運(yùn)行于Azul Systems公司的專有硬件Vega系統(tǒng)上的Java虛擬機(jī)。
- 每個(gè)Azul VM實(shí)例都可以管理至少數(shù)十個(gè)CPU和數(shù)百GB內(nèi)存的硬件資源,并提供在巨大內(nèi)存范圍內(nèi)實(shí)現(xiàn)可控的GC時(shí)間的垃圾收集器、專有硬件優(yōu)化的線程調(diào)度等優(yōu)秀特性。
- 2010年,Azul Systems公司開始從硬件轉(zhuǎn)向軟件,發(fā)布了自己的Zing JVM,可以在通用x86平臺(tái)上提供接近于Vega系統(tǒng)的特性。
-
Liquid VM
- 高性能Java虛擬機(jī)中的戰(zhàn)斗機(jī)。
- BEA公司開發(fā)的,直接運(yùn)行在自家Hypervisor系統(tǒng)上
- Liquid VM即是現(xiàn)在的JRockit VE(Virtual Edition)。Liquid VM不需要操作系統(tǒng)的支持,或者說它自己本身實(shí)現(xiàn)了一個(gè)專用操作系統(tǒng)的必要功能,如線程調(diào)度、文件系統(tǒng)、網(wǎng)絡(luò)支持等。
- 隨著JRockit虛擬機(jī)終止開發(fā),Liquid vM項(xiàng)目也停止了。
-
Apache Marmony
- Apache也曾經(jīng)推出過與JDK1.5和JDK1.6兼容的Java運(yùn)行平臺(tái)Apache Harmony。
- 它是IElf和Intel聯(lián)合開發(fā)的開源JVM,受到同樣開源的Open JDK的壓制,Sun堅(jiān)決不讓Harmony獲得JCP認(rèn)證,最終于2011年退役,IBM轉(zhuǎn)而參與OpenJDK
- 雖然目前并沒有Apache Harmony被大規(guī)模商用的案例,但是它的Java類庫(kù)代碼吸納進(jìn)了Android SDK。
-
Micorsoft JVM
- 微軟為了在IE3瀏覽器中支持Java Applets,開發(fā)了Microsoft JVM。
- 只能在window平臺(tái)下運(yùn)行。但確是當(dāng)時(shí)Windows下性能最好的Java VM。
- 1997年,Sun以侵犯商標(biāo)、不正當(dāng)競(jìng)爭(zhēng)罪名指控微軟成功,賠了Sun很多錢。微軟WindowsXP SP3中抹掉了其VM。現(xiàn)在Windows上安裝的jdk都是HotSpot。
-
Taobao JVM
- 由AliJVM團(tuán)隊(duì)發(fā)布。阿里,國(guó)內(nèi)使用Java最強(qiáng)大的公司,覆蓋云計(jì)算、金融、物流、電商等眾多領(lǐng)域,需要解決高并發(fā)、高可用、分布式的復(fù)合問題。有大量的開源產(chǎn)品。
- 基于OpenJDK開發(fā)了自己的定制版本AlibabaJDK,簡(jiǎn)稱AJDK。是整個(gè)阿里Java體系的基石。
- 基于OpenJDK Hotspot VM發(fā)布的國(guó)內(nèi)第一個(gè)優(yōu)化、深度定制且開源的高性能服務(wù)器版Java虛擬機(jī)。
- 創(chuàng)新的GCIH(GCinvisible heap)技術(shù)實(shí)現(xiàn)了off-heap,即將生命周期較長(zhǎng)的Java對(duì)象從heap中移到heap之外,并且GC不能管理GCIH內(nèi)部的Java對(duì)象,以此達(dá)到降低GC的回收頻率和提升GC的回收效率的目的。
- GCIH中的對(duì)象還能夠在多個(gè)Java虛擬機(jī)進(jìn)程中實(shí)現(xiàn)共享
- 使用crc32指令實(shí)現(xiàn)JvM intrinsic降低JNI的調(diào)用開銷
- PMU hardware的Java profiling tool和診斷協(xié)助功能
- 針對(duì)大數(shù)據(jù)場(chǎng)景的ZenGC
- taobao vm應(yīng)用在阿里產(chǎn)品上性能高,硬件嚴(yán)重依賴inte1的cpu,損失了兼容性,但提高了性能
- 目前已經(jīng)在淘寶、天貓上線,把Oracle官方JvM版本全部替換了。
-
Dalvik VM
- 谷歌開發(fā)的,應(yīng)用于Android系統(tǒng),并在Android2.2中提供了JIT,發(fā)展迅猛。
- Dalvik VM只能稱作虛擬機(jī),而不能稱作“Java虛擬機(jī)”,它沒有遵循 Java虛擬機(jī)規(guī)范
- 不能直接執(zhí)行Java的Class文件
- 基于寄存器架構(gòu),不是jvm的棧架構(gòu)。
- 執(zhí)行的是編譯以后的dex(Dalvik Executable)文件。執(zhí)行效率比較高。
- 它執(zhí)行的dex(Dalvik Executable)文件可以通過class文件轉(zhuǎn)化而來,使用Java語(yǔ)法編寫應(yīng)用程序,可以直接使用大部分的Java API等。
- Android 5.0使用支持提前編譯(Ahead of Time Compilation,AoT)的ART VM替換Dalvik VM。
-
Graal VM(未來虛擬機(jī))
- 2018年4月,Oracle Labs公開了GraalvM,號(hào)稱 “Run Programs Faster Anywhere”,勃勃野心。與1995年java的”write once,run anywhere"遙相呼應(yīng)。
- GraalVM在HotSpot VM基礎(chǔ)上增強(qiáng)而成的**跨語(yǔ)言全棧虛擬機(jī),可以作為“任何語(yǔ)言”**的運(yùn)行平臺(tái)使用。語(yǔ)言包括:Java、Scala、Groovy、Kotlin;C、C++、Javascript、Ruby、Python、R等
- 支持不同語(yǔ)言中混用對(duì)方的接口和對(duì)象,支持這些語(yǔ)言使用已經(jīng)編寫好的本地庫(kù)文件
- 工作原理是將這些語(yǔ)言的源代碼或源代碼編譯后的中間格式,通過解釋器轉(zhuǎn)換為能被Graal VM接受的中間表示。Graal VM提供Truffle工具集快速構(gòu)建面向一種新語(yǔ)言的解釋器。在運(yùn)行時(shí)還能進(jìn)行即時(shí)編譯優(yōu)化,獲得比原生編譯器更優(yōu)秀的執(zhí)行效率。
- 如果說HotSpot有一天真的被取代,Graalvm希望最大。但是Java的軟件生態(tài)沒有絲毫變化。
6. 總結(jié)
- 具體JVM的內(nèi)存結(jié)構(gòu),其實(shí)取決于其實(shí)現(xiàn),不同廠商的JVM,或者同一廠商發(fā)布的不同版本,都有可能存在一定差異。主要以O(shè)racle HotSpot VM為默認(rèn)虛擬機(jī)。
總結(jié)
以上是生活随笔為你收集整理的JVM虚拟机详解(一)JVM与JAVA体系统结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php array第一张图片_PHP a
- 下一篇: WINCE系统的PDA开发 xp系统+V