溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JVM的原理和應(yīng)用

發(fā)布時(shí)間:2021-06-21 15:24:34 來源:億速云 閱讀:206 作者:chen 欄目:編程語言

本篇內(nèi)容主要講解“JVM的原理和應(yīng)用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“JVM的原理和應(yīng)用”吧!

 簡介

Java是一門可以跨平臺的語言,但是Java本身是不可以實(shí)現(xiàn)跨平臺的,需要JVM實(shí)現(xiàn)跨平臺。javac編譯好后的class文件,在Windows、Linux、Mac等系統(tǒng)上,只要該系統(tǒng)安裝對應(yīng)的Java虛擬機(jī),class文件都可以運(yùn)行。達(dá)到  ”一次編譯,到處運(yùn)行” 的效果。

什么是JVM

JVM是可以運(yùn)行在Java代碼的虛擬的計(jì)算機(jī),既然是虛擬的計(jì)算機(jī),當(dāng)然也包含自己的CPU、字節(jié)碼指令集、寄存器、棧、垃圾回收、堆和存儲方法域,我們可以理解成JVM自己就是一套操作系統(tǒng)。

Java從編譯到執(zhí)行

Virtual Machine是物理機(jī)器的軟件實(shí)現(xiàn)。Java是用在VM上運(yùn)行的WORA(Write Once Run  Anywhere)概念而開發(fā)的。編譯器將Java文件編譯為Java  .class文件,然后將.class文件輸入到JVM中,JVM會加載并執(zhí)行類文件,如下圖所示:

JVM的原理和應(yīng)用

1. 編譯

對于Java代碼來說,是對于一個(gè)java類的編譯,利用java編譯器(javac.exe)將源碼編譯成能夠被JVM的類加載器加載的.class文件(字節(jié)碼),字節(jié)碼不是機(jī)器碼,是一個(gè)中間代碼,與平臺無關(guān)。java編譯一個(gè)類的時(shí)候,如果這個(gè)類所依賴的類還沒有被編譯,編譯器就會先編譯這個(gè)被依賴的類,然后引用,如果java編譯器在指定的目錄下找不到該類所依賴的類的  .class文件或者 .java源文件,就會報(bào) "Cant found sysbol"的異常錯(cuò)誤。

編譯后的字節(jié)碼文件格式主要分為兩部分:常量池和方法字節(jié)碼。

  • 常量池記錄的是代碼出現(xiàn)過的(常量、類名、成員變量等)以及符號引用(類引用、方法引用,成員變量引用等);

  • 方法字節(jié)碼中放的是各個(gè)方法的字節(jié)碼。

2. 執(zhí)行

java類執(zhí)行的過程大概分為兩個(gè)步驟:

類的加載

類的執(zhí)行

需要說明的一點(diǎn)的是:JVM主要在程序第一次運(yùn)行時(shí)主動使用類的時(shí)候,才會立即去加載。換言之,JVM并不是在運(yùn)行時(shí)就會把所有使用到的類都加載到內(nèi)存中,而是用到,不得不加載的時(shí)候,才加載進(jìn)來,而且只加載一次。

從跨平臺的語言到跨語言的平臺

目前有一百多種語言可以跑在Java虛擬機(jī)上....

JVM的原理和應(yīng)用

1、Java是跨平臺的語言

意思是說程序員寫代碼的時(shí)候只需要寫一次代碼,javac編譯也只編譯一次,但是可以在windows上運(yùn)行,也可以把打好的包放到linux或者macos上運(yùn)行。

JVM的原理和應(yīng)用

2、jvm是跨語言的平臺

任何語言只要使用提供的編譯器編譯相應(yīng)的語言,通過jvm就可以運(yùn)行了

JVM的原理和應(yīng)用

2、jvm與Java無關(guān)

任何語言只要你能編譯成class就可以編譯在JVM上

JVM的原理和應(yīng)用

JVM

JVM是一種規(guī)范(1)虛擬機(jī)是一種抽象的計(jì)算機(jī),通過從實(shí)際的計(jì)算機(jī)中仿真模擬各種計(jì)算機(jī)功能來實(shí)現(xiàn)的。JAVA虛擬機(jī)規(guī)范是一種對JAVA虛擬機(jī)實(shí)現(xiàn)的規(guī)范要求,是由oracle制定的,而我們平時(shí)常說的JAVA虛擬機(jī)一般是指的一種具體的JAVA虛擬機(jī)規(guī)范的實(shí)現(xiàn)。比如我們最經(jīng)常使用的JAVA虛擬機(jī)hotspot,其實(shí)JAVA虛擬機(jī)還有很多種實(shí)現(xiàn),甚至如果你對JAVA虛擬機(jī)規(guī)范有了深入的了解而且對此有興趣的話,可以寫一個(gè)自己的JAVA虛擬機(jī),當(dāng)然這其中的難度不難想象。Java虛擬機(jī)有自己完善的硬體架構(gòu),如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。JVM屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息,使得Java程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺上不加修改地運(yùn)行。

(2)JVM是Java程序運(yùn)行的環(huán)境,同時(shí)是一個(gè)操作系統(tǒng)的一個(gè)應(yīng)用程序進(jìn)程,因此它有自己的生命周期,也有己的代碼和數(shù)據(jù)空間。

(3)JVM體系主要是兩個(gè)JVM的內(nèi)部體系結(jié)構(gòu)分為三個(gè)子系統(tǒng)和兩大組件,分別是:類裝載(ClassLoader)子系統(tǒng)、執(zhí)行引擎子系統(tǒng)和GC子系統(tǒng)  組件是內(nèi)存運(yùn)行數(shù)據(jù)區(qū)域和本地接口。

常見的JVM實(shí)現(xiàn)

一、Hotspot

HotSpot VM,它是Sun  JDK和OpenJDK中所帶的虛擬機(jī),也是目前使用范圍最廣的Java虛擬機(jī)。但不一定所有人都知道的是,這個(gè)目前看起來“血統(tǒng)純正”的虛擬機(jī)在最初并非由Sun公司開發(fā),而是由一家名為“Longview  Technologies”的小公司設(shè)計(jì)的;甚至這個(gè)虛擬機(jī)最初并非是為Java語言而開發(fā)的,它來源于Strongtalk  VM,而這款虛擬機(jī)中相當(dāng)多的技術(shù)又是來源于一款支持Self語言實(shí)現(xiàn)“達(dá)到C語言50%以上的執(zhí)行效率”的目標(biāo)而設(shè)計(jì)的虛擬機(jī),  Sun公司注意到了這款虛擬機(jī)在JIT編譯上有許多優(yōu)秀的理念和實(shí)際效果,在1997年收購了Longview Technologies公司,從而獲得了HotSpot  VM。

HotSpot  VM既繼承了Sun之前兩款商用虛擬機(jī)的優(yōu)點(diǎn)(如前面提到的準(zhǔn)確式內(nèi)存管理),也有許多自己新的技術(shù)優(yōu)勢,如它名稱中的HotSpot指的就是它的熱點(diǎn)代碼探測技術(shù)(其實(shí)兩個(gè)VM基本上是同時(shí)期的獨(dú)立產(chǎn)品,HotSpot還稍早一些,HotSpot一開始就是準(zhǔn)確式GC,而Exact  VM之中也有與HotSpot幾乎一樣的熱點(diǎn)探測。為了Exact VM和HotSpot  VM哪個(gè)成為Sun主要支持的VM產(chǎn)品,在Sun公司內(nèi)部還有過爭論,HotSpot打敗Exact并不能算技術(shù)上的勝利), HotSpot  VM的熱點(diǎn)代碼探測能力可以通過執(zhí)行計(jì)數(shù)器找出最具有編譯價(jià)值的代碼,然后通知JIT編譯器以方法為單位進(jìn)行編譯。如果一個(gè)方法被頻繁調(diào)用,或方法中有效循環(huán)次數(shù)很多,將會分別觸發(fā)標(biāo)準(zhǔn)編譯和OSR(棧上替換)編譯動作。通過編譯器與解釋器恰當(dāng)?shù)貐f(xié)同工作,可以在最優(yōu)化的程序響應(yīng)時(shí)間與最佳執(zhí)行性能中取得平衡,而且無須等待本地代碼輸出才能執(zhí)行程序,即時(shí)編譯的時(shí)間壓力也相對減小,這樣有助于引入更多的代碼優(yōu)化技術(shù),輸出質(zhì)量更高的本地代碼。

在2006年的JavaOne大會上,Sun公司宣布最終會把Java開源,并在隨后的一年,陸續(xù)將JDK的各個(gè)部分(其中當(dāng)然也包括了HotSpot  VM)在GPL協(xié)議下公開了源碼,并在此基礎(chǔ)上建立了OpenJDK。這樣,HotSpot VM便成為了Sun  JDK和OpenJDK兩個(gè)實(shí)現(xiàn)極度接近的JDK項(xiàng)目的共同虛擬機(jī)。

在2008年和2009年,Oracle公司分別收購了BEA公司和Sun公司,這樣Oracle就同時(shí)擁有了兩款優(yōu)秀的Java虛擬機(jī):JRockit  VM和HotSpot VM。Oracle公司宣布在不久的將來(大約應(yīng)在發(fā)布JDK  8的時(shí)候)會完成這兩款虛擬機(jī)的整合工作,使之優(yōu)勢互補(bǔ),所以我們現(xiàn)在使用的虛擬機(jī)應(yīng)該就是整合之后的虛擬機(jī)。整合的方式大致上是在HotSpot的基礎(chǔ)上,移植JRockit的優(yōu)秀特性,譬如使用JRockit的垃圾回收器與MissionControl服務(wù),使用HotSpot的JIT編譯器與混合的運(yùn)行時(shí)系統(tǒng)。

查看JVM,我們只需要使用 java-version就可以查看了

JVM的原理和應(yīng)用

二、Jrockit

jrockit前身是BA jrockit,后被oracle收購,并免費(fèi)發(fā)布,但并不開源。

jrockit可以看做是兼容標(biāo)準(zhǔn)的JDK基礎(chǔ)上的JVM,同原有的JVM相比,jrockit聲稱在速度上有顯著的提高(甚至超過70%),jrockit在速度上的優(yōu)勢使其應(yīng)用在時(shí)間敏感的領(lǐng)域內(nèi),如軍事,電信,控制等,這也得益于其針對不同處理器架構(gòu)所做的優(yōu)化,曾經(jīng)號稱是世界上最快的JVM

三、J9

J9 是一個(gè)IBM推出的Java虛擬機(jī)和類庫,J9在IBM的從移動設(shè)備到企業(yè)解決方案中廣泛的被使用

四、Microsoft VM

來自于微軟的JVM

五、TaobaoVM

hotspot深度定制版,除了在性能優(yōu)化方面下足了功夫,TaobaoVM還在HotSpot的基礎(chǔ)之上大幅度擴(kuò)充了一些特定的增強(qiáng)實(shí)現(xiàn)。比如創(chuàng)新的GCIH(GC  invisible  heap)技術(shù)實(shí)現(xiàn)off-heap,這樣一來就可以將生命周期較長的Java對象從heap中移至heap之外,并且GC不能管理GCIH內(nèi)部的Java對象,這樣做最大的好處就是降低了GC的回收平率以及提升了GC的回收效率,并且GCIH中的對象還能夠在多個(gè)Java虛擬機(jī)進(jìn)程中實(shí)現(xiàn)共享。其他擴(kuò)充技術(shù)還有利用PMU  hardware的Java profiling tool和診斷協(xié)助功能等。

據(jù)說淘寶里面大概有十個(gè)人能夠手寫TaobaoVM,都是P9 P10級別的

六、LiquidVM

直接針對于硬件

七、azul zing

最新垃圾回收的業(yè)界標(biāo)桿,性能極高,但是這個(gè)是收費(fèi)的,并且只有土豪才用的起。

官網(wǎng):www.azul.com

JDK JRE JVM

JVM的原理和應(yīng)用

JVM : 英文名稱(Java Virtual Machine),就是我們耳熟能詳?shù)?Java  虛擬機(jī)。它只認(rèn)識 xxx.class 這種類型的文件,它能夠?qū)?class 文件中的字節(jié)碼指令進(jìn)行識別并調(diào)用操作系統(tǒng)向上的 API 完成動作。所以說,jvm 是  Java 能夠跨平臺的核心,具體的下文會詳細(xì)說明。

JRE : 英文名稱(Java Runtime Environment),我們叫它:Java 運(yùn)行時(shí)環(huán)境。它主要包含兩個(gè)部分,jvm 的標(biāo)準(zhǔn)實(shí)現(xiàn)和  Java 的一些基本類庫。它相對于 jvm 來說,多出來的是一部分的 Java 類庫。

JDK : 英文名稱(Java Development Kit),Java 開發(fā)工具包。jdk 是整個(gè) Java 開發(fā)的核心,它集成了 jre  和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。

顯然,這三者的關(guān)系是:一層層的嵌套關(guān)系。JDK>JRE>JVM

為什么我們的電腦在裝完 jdk 后會有兩個(gè)版本的 jre?

JVM的原理和應(yīng)用

沒有聯(lián)系。甚至準(zhǔn)確的來說,它倆是一樣的,無論是用哪一個(gè)都是可以的。只是很多人習(xí)慣將會單獨(dú)安裝另一個(gè)  jre,雖然單獨(dú)安裝的 jre 也并沒有被使用,原因可能就是剛開始大家都不清楚 jdk 和 jre 之間的關(guān)系,所以就默認(rèn)的都安裝上了。

到此,相信大家對“JVM的原理和應(yīng)用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI