Java關於 JVM JDK 和 JRE 通俗的解答

JVM

Java虛擬機(JVM)是運行 Java 位元組碼的虛擬機。JVM有針對不同系統的特定實現(Windows,Linux,macOS),目的是使用相同的位元組碼,它們都會給出相同的結果。

什麼是位元組碼?採用位元組碼的好處是什麼?

在 Java 中,JVM可以理解的程式碼就叫做位元組碼(即擴展名為 .class 的文件),它不面向任何特定的處理器,只面向虛擬機。Java 語言通過位元組碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。所以 Java 程式運行時比較高效,而且,由於位元組碼並不針對一種特定的機器,因此,Java程式無須重新編譯便可在多種不同作業系統的電腦上運行。

Java 程式從源程式碼到運行一般有下面3步:

Java程式運行過程

我們需要格外注意的是 .class->機器碼 這一步。在這一步 JVM 類載入器首先載入位元組碼文件,然後通過解釋器逐行解釋執行,這種方式的執行速度會相對比較慢。而且,有些方法和程式碼塊是經常需要被調用的(也就是所謂的熱點程式碼),所以後面引進了 JIT 編譯器,而JIT 屬於運行時編譯。當 JIT 編譯器完成第一次編譯後,其會將位元組碼對應的機器碼保存下來,下次可以直接使用。而我們知道,機器碼的運行效率肯定是高於 Java 解釋器的。這也解釋了我們為什麼經常會說 Java 是編譯與解釋共存的語言。

HotSpot採用了惰性評估(Lazy Evaluation)的做法,根據二八定律,消耗大部分系統資源的只有那一小部分的程式碼(熱點程式碼),而這也就是JIT所需要編譯的部分。JVM會根據程式碼每次被執行的情況收集資訊並相應地做出一些優化,因此執行的次數越多,它的速度就越快。JDK 9引入了一種新的編譯模式AOT(Ahead of Time Compilation),它是直接將位元組碼編譯成機器碼,這樣就避免了JIT預熱等各方面的開銷。JDK支援分層編譯和AOT協作使用。但是 ,AOT 編譯器的編譯品質是肯定比不上 JIT 編譯器的。

總結:

Java虛擬機(JVM)是運行 Java 位元組碼的虛擬機。JVM有針對不同系統的特定實現(Windows,Linux,macOS),目的是使用相同的位元組碼,它們都會給出相同的結果。位元組碼和不同系統的 JVM 實現是 Java 語言「一次編譯,隨處可以運行」的關鍵所在。

JDK 和 JRE

JDK是Java Development Kit,它是功能齊全的Java SDK。它擁有JRE所擁有的一切,還有編譯器(javac)和工具(如javadoc和jdb)。它能夠創建和編譯程式。

JRE 是 Java運行時環境。它是運行已編譯 Java 程式所需的所有內容的集合,包括 Java虛擬機(JVM),Java類庫,java命令和其他的一些基礎構件。但是,它不能用於創建新程式。

如果你只是為了運行一下 Java 程式的話,那麼你只需要安裝 JRE 就可以了。如果你需要進行一些 Java 編程方面的工作,那麼你就需要安裝JDK了。但是,這不是絕對的。有時,即使您不打算在電腦上進行任何Java開發,仍然需要安裝JDK。例如,如果要使用JSP部署Web應用程式,那麼從技術上講,您只是在應用程式伺服器中運行Java程式。那你為什麼需要JDK呢?因為應用程式伺服器會將 JSP 轉換為 Java servlet,並且需要使用 JDK 來編譯 servlet。