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

java程式的執行機制

技術標籤:計算機基礎jvm

java程式的執行機制

1.java的執行機制

java語言是一種特殊的高階語言,它既具有解釋型語言的特徵,也具有編譯型語言的特徵,因為Java程式要經過先編譯,後解釋兩個步驟。
java的核心機制有兩個,一個是jvm虛擬機器,另一個是垃圾回收機制GC。

2.高階語言的執行機制

計算機高階語言按程式的執行方式可以分為 編譯型 和解釋型兩種。編譯型語言是指使用專門的編譯器,針對特定平臺(作業系統)將某種高階語言原始碼一次性“翻譯”成可被該平臺硬體執行的機器碼(包括機器指令和運算元),幷包裝成該平臺所能識別的可執行性程式的格式,這個轉換過程稱為編譯(Compile),編譯生成的可執行性程式可以脫離開發環境,在特定的平臺上獨立執行。

有些程式編譯結束後,還可能需要對其他編譯好的目的碼進行連結,即組裝兩個以上的目的碼模組生成最終的可執行性程式,通過這種方式實現低層次的程式碼複用。
因為編譯型語言是一次性地編譯成機器碼,所以可以脫離開發環境獨立執行,而且通常執行效率較:高:但因為編譯型語言的程式被編譯成特定平臺上的機器碼,因此編譯生成的可執行性程式通常無法移植到其他平臺上執行;如果需要移植,則必須將原始碼複製到特定平臺上,針對特定平臺進行修改,至少也需要採用特定平臺上的編譯器重新編譯。
現有的C. C++, Objective-C. Swift. Kotlin等高階語言都屬於編譯型語言。
解釋型語言是指使用專門的直譯器對源程式逐行解釋成特定平臺的機器碼並立即執行的語言。解釋型語言通常不會進行整體性的編譯和連結處理,解釋型語言相當於把變異性語言中的編譯和解釋過程混合到一起同時完成。
可以認為:每次執行解釋型語言的程式都需要進行一次編譯,因此解釋型語言的程式執行效率通常較低,而且不能脫離直譯器獨立執行。但解釋型語言有一個優勢:跨平臺比較容易,只提供特定平臺的直譯器即可,每個特定平臺上的直譯器負責將源程式解釋成 特定平臺的機器指令即可。解釋型語言可以方便的實現原程式的移至,但這是以犧牲程式的執行效率為代價。

3.java程式的執行機制與jVM

Java語言比較特殊,由Java語言編寫的程式需要經過編譯步驟,但這個編譯步驟並不會生成特定平臺的機器碼,而是生成與平臺無關的位元組碼(也就是class檔案)。當然,這種位元組碼不是可執行的,必須使用Java直譯器來解釋執行。因此可以認為Java語言既是編譯型語言,也是解釋型語言。或者說,Java語言既不是純粹的解釋型語言,也不是純粹的編譯型語言。Java程式的執行過程必須經過編譯,後解釋兩個步驟。

Java語言通過javac編輯器把java原始檔,編譯成位元組碼檔案,而負責解釋執行位元組碼檔案的是JVM(Java Virtual Machine)虛擬機器。JVM是可以執行Java位元組碼的虛擬機器。所有的平臺上的JVM想變一起提供相同的程式設計介面,而編譯器只需要面向虛擬機器,生成虛擬機器能夠理解的程式碼,然後由虛擬機器執行。在一些虛擬機器的實現中,還會將一些虛擬機器程式碼轉換成特定系統的機器碼執行,從而提高效率。
1.javac程式是一個Java編譯器。它將檔案HelloWorld.java編譯成HelloWorld.class檔案,併發送到java虛擬機器。虛擬機器執行編譯器放在class檔案中的位元組碼。

(1.)JVM 載入 class 檔案的原理機制

jdk

2.JVM 中類的裝載是由類載入器(ClassLoader)和它的子類來實現的,Java 中的類載入器是 一個重要的 Java 執行時系統元件,它負責在執行時查詢和裝入類檔案中的類。
由於 Java 的跨平臺性,經過編譯的 Java 源程式並不是一個可執行程式,而是一個或多個類檔案。 當 Java 程式需要使用某個類時,JVM 會確保這個類已經被載入、連線(驗證、準備和解析)和 初始化。
3.的載入是指把類的.class 檔案中的資料讀入到記憶體中,通常是建立一個位元組陣列讀 入.class 檔案,然後產生與所載入類對應的 Class 物件。載入完成後,Class 物件還不完整,所以此時的類還不可用。當類被載入後就進入連線階段,這一階段包括驗證、準備(為靜態變數分 配記憶體並設定預設的初始值)和解析(將符號引用替換為直接引用)三個步驟。最後 JVM 對類 進行初始化,包括:1)如果類存在直接的父類並且這個類還沒有被初始化,那麼就先初始化父類; 2)如果類中存在初始化語句,就依次執行這些初始化語句。

類的載入是由類載入器完成的,類載入器包括:根載入器(BootStrap)、擴充套件載入器(Extension)、 系統載入器(System)和使用者自定義類載入器(java.lang.ClassLoader 的子類)。從 Java 2(JDK 1.2)開始,類載入過程採取了父親委託機制(PDM)。PDM 更好的保證了 Java 平臺的安全性, 在該機制中,JVM 自帶的 Bootstrap 是根載入器,其他的載入器都有且僅有一個父類載入器。類的載入首先請求父類載入器載入,父類載入器無能為力時才由其子類載入器自行載入。JVM 不會向 Java 程式提供對 Bootstrap 的引用。

下面是關於幾個類載入器的說明:

Bootstrap:一般用原生代碼實現,負責載入 JVM 基礎核心類庫(rt.jar);
Extension:從 java.ext.dirs 系統屬性所指定的目錄中載入類庫,它的父載入器是 Bootstrap;

System:又叫應用類載入器,其父類是 Extension。它是應用最廣泛的類載入器。它從環境變數 classpath 或者系統屬性 java.class.path 所指定的目錄中記載類,是使用者自定義載入 器的預設父載入器。

4.Java執行機制(一次編碼,一次解析,兩次編譯)和優化技術

Java程式碼從編譯到執行的過程是這樣的:

(1)開發期,編碼階段,編寫Java原始碼

(2)編譯期—Javac第一次編譯,通過Javac編譯器編譯成.class檔案(位元組碼檔案),

(3)編譯期—JVM解析,通過JVM內嵌的直譯器(類載入器)解析.class檔案

(4)編譯期—JVM第二次編譯,

① JIT編譯器(即時編譯器),把經常執行的程式碼作為熱點程式碼,編譯成與平臺相關的機器碼,並進行各種層次優化

② AOT編譯器,直接將所有程式碼編譯成平臺相關的機器碼

(5)執行期,執行機器碼檔案

Java優化技術:JIT和AOT,若JVM載入.Class檔案後,直接解釋執行,勢必會影響效率;
JVM提供了兩種編譯器,用於編譯執行:
JIT優化技術,將常用的程式碼編譯成機器碼

AOT優化技術,在執行前,通過工具直接將位元組碼轉換成機器碼

所以目前主流的JDK8版本,Java執行模式其實是** 解釋-編譯 **的混合模式(-Xmixed)