02-有哪些常見的JVM?請說下Java代碼的運行機制

1.JVM虛擬機介紹

  • 虛擬機概念:

    虛擬機(Virtual Machine)指通過軟件模擬的具有完整硬件系統(tǒng)功能的、運行在一個完全隔離環(huán)境中的完整計算機系統(tǒng)。在實體計算機中能夠完成的工作在虛擬機中都能夠實現(xiàn)。在計算機中創(chuàng)建虛擬機時,需要將實體機的部分硬盤和內存容量作為虛擬機的硬盤和內存容量。每個虛擬機都有獨立的CMOS、硬盤和操作系統(tǒng),可以像使用實體機一樣對虛擬機進行操作。

  • 關鍵字理解:

    中文名 外文名 定義
    虛擬機 Virtual Machine 具有完整硬件系統(tǒng)功能的完整計算機系統(tǒng)
    技術 與實體機區(qū)別 常見虛擬機
    虛擬化技術的一種 可以像使用實體機一樣使用 Java虛擬機,Linux虛擬機,windows虛擬機
  • 虛擬機分類

    • Linux虛擬機

      一種安裝在Windows上的虛擬linux操作環(huán)境,就被稱為linux虛擬機。它實際上只是個文件而已,是虛擬的linux環(huán)境,而非真正意義上的操作系統(tǒng)。但是它們的實際效果是一樣的。所以安裝在虛擬機上使用好。常用安裝虛擬機軟件有:vmware、VirtualBox等。

    • Java虛擬機

      Java虛擬機(JVM)是Java Virtual Machine的縮寫,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能模擬來實現(xiàn)的。Java虛擬機有自己完善的硬件架構,如處理器、堆棧、寄存器等,還具有相應的指令系統(tǒng)。

  • Java虛擬機的優(yōu)點

    Java語言的一個非常重要的特點就是與平臺的無關性。而使用Java虛擬機是實現(xiàn)這一特點的關鍵。一般的高級語言如果要在不同的平臺上運行,至少需要編譯成不同的目標代碼。而引入Java語言虛擬機后,Java語言在不同平臺上運行時不需要重新編譯。Java語言使用Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行。Java虛擬機在執(zhí)行字節(jié)碼時,把字節(jié)碼解釋成具體平臺上的機器指令執(zhí)行。

    一句話就是:一次編譯,到處運行,并且具備自動內存管理+自動垃圾回收功能

  • 總結

    Java虛擬機是Java語言底層實現(xiàn)的基礎,對Java語言感興趣的人都應對Java虛擬機有個大概的了解。這有助于理解Java語言的一些性質,也有助于使用Java語言。對于要在特定平臺上實現(xiàn)Java虛擬機的軟件人員,Java語言的編譯器作者以及要用硬件芯片實現(xiàn)Java虛擬機的人來說,則必須深刻理解Java虛擬機的規(guī)范。另外,如果想擴展Java語言,或是把其它語言編譯成Java語言的字節(jié)碼,也需要深入地了解Java虛擬機。

2.常見的JVM

image

很多公司都有自己的JVM,比如Orcale的HotSpot,也是我們學習和使用的重點JVM虛擬機。

【其他兩款特殊虛擬機介紹】

  1. Sun Classic VM介紹:
早在1996年Java1.0版本的時候,SUN公司就發(fā)布了一款名為SUN Classic VM的Java 虛擬機,同時也是世界上第一款商用Java虛擬機,JDK1.4時完全被淘汰。這款虛擬機內部只提供解釋器,如果使用JIT編譯器,就需要進行外掛。但是一旦使用了JIT編譯器,JIT就會接管虛擬機的執(zhí)行系統(tǒng),解釋器就不再工作。 解釋器和編譯器不能配合工作。



現(xiàn)在hotspot已經(jīng)內置了此虛擬機。
  1. Dalvik VM:
谷歌開發(fā)的應用于Android系統(tǒng)的虛擬機,并在Android2.2中提供了JIT,發(fā)展迅猛。



Dalvik VM 并不能直接執(zhí)行Java的Class文件,因為其并沒有遵循Java虛擬機的規(guī)范,它是基于寄存器結構而不是jvm的棧架構,因此其執(zhí)行的是編譯以后的dex(Dalvik Executable)文件【可以通過Class文件進行轉化】,執(zhí)行效率較高。



Android5.0使用了支持提前編譯(Ahead of Time Compilation,AOT)的ART VM替換Dalvik VM。

我們的學習路線圖就通過從一個類的加載開始,來學習Java是如何將代碼運行起來的,由點到面的方式,一步一步深入理解JVM的整體運行機制。
image

3.Java代碼的運行機制

  • 我們平時寫的Java代碼,到底是如何運行起來的?

    我們都知道,我們平時創(chuàng)建的一個一個類,在本地磁盤中的文件名后綴就是 .java,比如User.java 、Product.java ,這也叫做源代碼文件。

    這些源代碼文件必須經(jīng)歷我們的javac工具進行編譯后生成 .class 的字節(jié)碼文件才能被運行。

image

那接著我們就要繼續(xù)思考了:那這些 .class 字節(jié)碼文件又是如何運行起來的?

(這里我們可以借助于DOS窗口執(zhí)行 java 命令進行啟動)

image

此時一旦采用 java 命令,實際上就是啟動了一個JVM進程,由JVM來負責加載這些字節(jié)碼文件到內存進行執(zhí)行。
image

而將class字節(jié)碼文件加載到虛擬機的內存,這個過程稱為類加載,其中涉及到 【類加載機制】和【類加載器】的概念。
image

當字節(jié)碼文件被類加載器加載進入到JVM內存中后,會通過JVM的執(zhí)行引擎來執(zhí)行我們內存中對應的類,比如類中的main方法,就會先被執(zhí)行,而main方法中如果還涉及到其他的對象引用,類加載又會開始加載對應的字節(jié)碼文件到內存,再由JVM進行調用執(zhí)行。(如下圖)

image

ok,通過以上的分析,我們可以先整體對java代碼的運行流程做了一個全面的介紹,接下來再深入分析類加載器又是如何執(zhí)行的,一步一步深入學習。

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容