1. 程式人生 > >談談java的執行機制

談談java的執行機制

1.高階語言的執行機制

我們程式設計都是用的高階語言(寫彙編和機器語言的大牛們除外),計算機不能直接理解高階語言,只能理解和執行機器語言,所以必須要把高階語言翻譯成機器語言,計算機才能執行高階語言所編寫的程式。

翻譯,其實翻譯的方式有兩種,一個是編譯,一個是解釋。兩種方式只是翻譯的時間不同。

1.1編譯型語言    (如C、C++、Objective-C)

使用專門的編譯器,針對特定平臺(作業系統)將某種高階語言原始碼一次性”翻譯“成可被該平臺硬體執行的機器碼(包括機器指令和運算元),幷包裝成該平臺所能識別的可執行性程式的格式。

優點: 執行效率較高

缺點:編譯生成的程式無法移植

1.2解釋型語言    (如Ruby、Python)

使用專門的直譯器對源程式逐行解釋成特定平臺的機器碼並立即執行的語言。解釋型語言通常不會整體性的編譯和連結處理,解釋型語言相當於把編譯型語言中的編譯和解釋過程混合到一起同時完成。

優點:跨平臺較容易

缺點:效率較低,不能脫離直譯器獨立執行

2.Java語言的執行機制

2.1Java是編譯型和解釋型語言的結合體。

①首先採用通用的java編譯器將java源程式編譯成為與平臺無關的位元組碼檔案(class檔案)

②然後由java虛擬機器(JVM)對位元組碼檔案解釋執行。

注意:java位元組碼具有平臺無關性、可以在各種不同系統平臺中執行,但是需要有不同版本的java虛擬機器,不同系統平臺的java執行環境其java虛擬機器是不一樣的。

 

2.2 JVM(Java Virtual Machine Java虛擬機器)

(1)JVM是Java位元組碼執行的引擎,為java程式的執行提供必要的支援,還能優化java位元組碼,使之轉換成效率更高的機器指令。程式設計師編寫的程式最終都要在JVM上執行,JVM中類的裝載是由類載入器(ClassLoader)和它的子類來實現的。  (2)ClassLoader是java執行時一個重要的系統元件,負責在執行時查詢和裝入類檔案的類。

(3)JVM遮蔽了與具體作業系統平臺相關的資訊,從而實現了java程式只需生成在JVM上執行的位元組碼檔案(class檔案),就可以在多種平臺上不加修改地執行。不同平臺對應著不同的JVM,在執行位元組碼時,JVM負責將每一條要執行的位元組碼送給直譯器,直譯器再將其翻譯成特定平臺環境的機器指令並執行。java語言最重要的特點就是跨平臺執行,使用JVM就是為了支援與作業系統無關,實現跨平臺執行。

2.3 ClassLoader

(1)是JVM實現的一部分,包括bootstrapclassloader(啟動類載入器)

(2)ClassLoader在JVM執行的時候載入java核心的API,通過java程式實現兩個ClassLoader:

①ExtClassLoader,它的作用是用來載入java的擴充套件API,也就是lib\ext類;

②AppClassLoader,用來載入使用者機器上CLASSPATH設定目錄中的Class.

(3)ClassLoader載入流程:當執行一個程式的時候,JVM啟動,執行bootstrapclassloader,該ClassLoader載入java核心API,然後呼叫ExtClassLoader載入擴充套件API,最後AppClassLoader載入CLASSPATH目錄下定義的Class.

2.4JRE

JRE是JavaRuntimeEnvironment,java執行時環境,它是java程式執行所必須的環境集合,主要由java虛擬機器、java平臺核心類和若干支援檔案組成。其不包含開發工具、編譯器、偵錯程式以及其他工具。

在執行java程式的時候,作業系統會按照下面順序尋找JRE環境。

(1)先查詢當前目錄下有沒有JRE

(2)再查詢父目錄下有沒有JRE

(3)接著在環境變數PATH制定的路徑中查詢JRE

(4)登錄檔檢視CurrentVersion的鍵值指向哪個JRE

JRE自帶的基礎類庫主要在JRE\LIB\rt.jar檔案中。在程式執行時,JRE由ClassLoader(類載入器)負責查詢和載入程式引用到的基類庫和其他類庫。基礎類庫,Classloader會自動到rt.jar的位置;其他的類庫,ClassLoader在環境變數CLASSPATH制定的路徑中搜索。

2.5 JDK

JDK是Java Development Kit,簡稱java開發工具包。

JDK是java的核心。它包括java執行環境、一堆java工具盒java基礎的類庫(rt.jar)。

JDK包含JRE的全部內容外,還包含開發者用以編譯、除錯和執行java程式的工具。

JDK、JRE、JVM之間的關係:

JDK、JRE、JVM之間是包含關係。範圍由大到小依次為JDK、JRE、JVM。