關於Java-JVM效能最佳化的面試題

關於Java-JVM效能最佳化的面試題

描述一下JVM載入Class檔案的原理機制?

Java 語言是一種具有動態性的解釋型語言,類(Class)只有被加

載到JVM 後才能執行。當執行指定程式時,JVM 會將編譯生成的。class 檔案按照需求和一定的規則載入到記憶體中,並組織成為一個完整的Java 應用程式。這個載入過程是由類載入器完成,具體來說,就是由ClassLoader 和它的子類來實現的。類載入器本身也是一個類,其實質是把類檔案從硬碟讀取到記憶體中。

類的載入方式分為隱式載入和顯示載入。隱式載入指的是程式在使用new 等方式建立物件時,會隱式地呼叫類的載入器把對應的類載入到JVM 中。顯示載入指的是透過直接呼叫class。forName() 方法來把所需的類載入到JVM 中。

任何一個工程專案都是由許多類組成的,當程式啟動時,只把需要的類載入到JVM 中,其他類只有被使用到的時候才會被載入,採用這種方法一方面可以加快載入速度,另一方面可以節約程式執行時對記憶體的開銷。此外,在Java 語言中,每個類或介面都對應一個。class檔案,這些檔案可以被看成是一個個可以被動態載入的單元,因此當只有部分類被修改時,只需要重新編譯變化的類即可,而不需要重新編譯所有檔案,因此加快了編譯速度。

在Java 語言中,類的載入是動態的,它並不會一次性將所有類全

部載入後再執行,而是保證程式執行的基礎類(例如基類)完全加

載到JVM 中,至於其他類,則在需要的時候才載入。

類載入的主要步驟:

• 裝載。根據查詢路徑找到相應的class 檔案,然後匯入。

• 連結。連結又可分為3 個小步:

• 檢查,檢查待載入的class 檔案的正確性。

• 準備,給類中的靜態變數分配儲存空間。

• 解析,將符號引用轉換為直接引用(這一步可選)

• 初始化。對靜態變數和靜態程式碼塊執行初始化工作。