Java跨平臺原理與Java虛擬機器(JVM)

風青宇發表於2021-03-04

Java跨平臺原理(位元組碼檔案、虛擬機器)

C/C++語言都直接編譯成針對特定平臺機器碼。如果要跨平臺,需要使用相應的編譯器重新編譯。
Java源程式(.java)要先編譯成與平臺無關的位元組碼檔案(.class),然後位元組碼檔案再解釋成機器碼執行。解釋是通過Java虛擬機器來執行的。
位元組碼檔案不面向任何具體平臺,只面向虛擬機器。
Java虛擬機器是可執行Java位元組碼檔案的虛擬計算機。不同平臺的虛擬機器是不同的,但它們都提供了相同的介面。
Java語言具有一次編譯,到處執行的特點。就是說編譯後的.class可以跨平臺執行,前提是該平臺具有相應的Java虛擬機器。但是效能比C/C++要低。
Java的跨平臺原理決定了其效能沒有C/C++高。

由原始檔(.java)—>位元組碼檔案(.class)(二進位制檔案)-----> 解釋---->Unix,Win,Linux等機器。

  • 一次編譯,到處執行。
  • 編譯器的作用:將原始檔編譯成class檔案。
  • 虛擬機器的作用:將位元組碼檔案解釋成對應平臺機器碼並執行。
  • java可以實現跨所有的平臺?只有提供並且安裝了相對應的虛擬機器就可以跨該平臺。
  • 虛擬機器和直譯器的關係:直譯器是虛擬機器的一個重要的組成部分。
  • Java語言的執行要經過編譯和解釋兩個階段。

對比C語言的跨平臺原理

Java虛擬機器(JVM)

JVM是Java Virtual Machine(Java虛擬機器)的縮寫,它是整個Java實現跨平臺的最核心的部分,所有的java程式會首先被編譯為.class的類檔案,這種類檔案可以在虛擬機器上執行,也就是說class並不直接與機器的作業系統相對應,而是經過虛擬機器間接與作業系統互動,由虛擬機器將程式解釋給本地系統執行。JVM是Java平臺的基礎,和實際的機器一樣,它也有自己的指令集,並且在執行時操作不同的記憶體區域。 JVM通過抽象作業系統和CPU結構,提供了一種與平臺無關的程式碼執行方法,即與特殊的實現方法、主機硬體、主機作業系統無關。JVM的主要工作是解釋自己的指令集(即位元組碼)到CPU的指令集或對應的系統呼叫,保護使用者免被惡意程式騷擾。 JVM對上層的Java原始檔是不關心的,它關注的只是由原始檔生成的類檔案(.class檔案)。


JRE

JRE是java runtime environment(java執行環境)的縮寫。光有JVM還不能讓class檔案執行,因為在解釋class的時候JVM需要呼叫解釋所需要的類庫lib。在JDK的安裝目錄裡你可以找到jre目錄,裡面有兩個資料夾bin和lib,在這裡可以認為bin裡的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和lib和起來就稱為jre。所以,在你寫完java程式編譯成.class之後,你可以把這個.class檔案和jre一起打包發給朋友,這樣你的朋友就可以執行你寫程式了(jre裡有執行.class的java.exe)。JRE是Sun公司釋出的一個更大的系統,它裡面就有一個JVM。JRE就與具體的CPU結構和作業系統有關,是執行Java程式必不可少的(除非用其他一些編譯環境編譯成.exe可執行檔案……),JRE的地位就象一臺PC機一樣,我們寫好的Win32應用程式需要作業系統幫我們執行,同樣的,我們編寫的Java程式也必須要JRE才能執行。


JDK

JDK是java development kit(java開發工具包)的縮寫。每個學java的人都會先在機器上裝一個JDK,那 讓我們看一下JDK的安裝目錄。在目錄下面有六個資料夾、一個src類庫原始碼壓縮包、和其他幾個宣告檔案。其中,真正在執行java時起作用的是以下四個資料夾:bin、include、lib、jre。現在我們可以看出這樣一個關係,JDK包含JRE,而JRE包含JVM。
bin: 最主要的是編譯器(javac.exe)
include: java和JVM互動用的標頭檔案
lib:類庫
jre: java執行環境

注意:這裡的bin、lib資料夾和jre裡的bin、lib是不同的

總的來說JDK是用於java程式的開發,而jre則是隻能執行class而沒有編譯的功能。eclipse、idea等其他IDE有自己的編譯器而不是用JDK bin目錄中自帶的,所以在安裝時你會發現他們只要求你選jre路徑就ok了。


JDK,JRE,JVM三者關係

  • jdk是JAVA程式開發時用的開發工具包,其內部也有JRE執行環境JRE。
  • JRE是JAVA程式執行時需要的執行環境,就是說如果你光是執行JAVA程式而不是去搞開發的話,只安裝JRE就能執行已經存在的JAVA程式了。
  • JDk、JRE內部都包含JAVA虛擬機器JVM,JAVA虛擬機器內部包含許多應用程式的類的直譯器和類載入器等等。

JVM執行原理詳解

相關文章