1. 程式人生 > >關於java類加載的那些事

關於java類加載的那些事

link ash 方式 是我 引入 ext 方法區 load 最終

首先,類加載的定義:

類加載(Class Loading)是一種機制,他描述的是將字節碼以文件形式加載到內存再經過連接、初始化後,最終形成可以被虛擬機直接使用的Java類型地過程。

其次,類加載器的分類:

啟動類加載器(Bootstrap ClassLoader):負責加載<\JAVA——HOME>\lib目錄中的並且可以被虛擬機識別的;

擴展類加載器(Extension ClassLoader):負責加載<\JAVA_HOME>\lib\ext目錄中的所有類庫,開發者可以直接使用擴展類加載器;

應用程序類加載器(Application ClassLoader):它是ClassLoader中的getSystemClassLoader()方法的返回值,所以也稱它為系統類加載器。他負責加載用戶類路徑(ClassPath)上所指定的類庫。

Class Loading 包含了加載(Loading)、連接(Linking)、初始化(Initialization)三大部分,其中Linking又包含了三個部分:校驗(Verification)、準備(Preparation)、解析(Resolution)。而一個類的生命周期只是在Class Loader的基礎上多了:使用(Using),卸載(Unloading)兩部分。

Loading是Class Loading的第一步,他的工作是負責將字節碼(bytecode)加載到JVM內存中,這個內存空間就是我們常說的方法區。在JVM規範中,Loading需要完成以下三點:

1. 通過一個類的全限定名來獲取定義此類的二進制字節流

2. 將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構;

3. 在內存中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口。

在Loading過程中JVM規範並沒有明確表示要從什麽地方加載字節碼,所以用戶可以通過自定義類加器的方式加載任何地方的字節碼。

為了支持類多版本共存,JVM提供了加載器帶有命名空間的功能,可以在不修包名的情況下實現多版本共存。

而加載器帶有命名空間後又帶來了Object類可能重復的問題,為此引入雙親委派模型:子加載器收到加載請求後需要向上傳遞,優先父加載器加載。

關於java類加載的那些事