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運行原理詳解
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266216.html
標籤:Java
上一篇:學習筆記:Java泛型
