您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Java中如何實現類加載機制,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
Java的程序要運行需要將編譯好的class文件加載到JVM運行時數據區。
在了解類的加載機制之前,我們需要了解一下類的生命周期。Java類從被加載到JVM內存開始,到卸載出內存為止,它的整個生命周期包括了:加載(Loading),驗證(Verification),準備(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸載(Unloading)七個階段。
Java類的加載需要用到類加載器。類加載器負責裝入類,搜索網絡,jar,zip,文件夾,二進制數據,內存等指定位置的資源。一個Java程序運行,至少有3個不同的類加載器實例,負責加載不同的類。這三個類加載器分別為,啟動類加載器(Bootstrap ClassLoader),擴展類加載器(Extension ClassLoader),應用程序類加載器(Application ClassLoader)。
通過JDK提供的API:java.lang.Class.getClassLoader() 可以進行類加載器的查看,該API會返回裝載類的類加載器,如果這個類是由Bootstrap ClassLoader加載的,那個這個方法會返回null。
代碼示例:
public class ClassLoaderView {
public static void main(String[] args) throws Exception {
// 加載核心類庫的 BootStrap ClassLoader
System.out.println(
"核心類庫加載器:"
+ ClassLoaderView.class
.getClassLoader()
.loadClass("java.lang.String")
.getClassLoader());
// 加載拓展庫的 Extension ClassLoader
System.out.println(
"拓展類庫加載器:"
+ ClassLoaderView.class
.getClassLoader()
.loadClass("com.sun.nio.zipfs.ZipCoder")
.getClassLoader());
// 加載應用程序的 Application ClassLoader
System.out.println("應用程序庫加載器:" + ClassLoaderView.class.getClassLoader());
}
}
//運行結果:
核心類庫加載器:null
拓展類庫加載器:sun.misc.Launcher$ExtClassLoader@7f31245a
應用程序庫加載器:sun.misc.Launcher$AppClassLoader@18b4aac2
class信息可以存在不同的地方,那么JVM是如何知道我們的類存在什么地方的哪?通過查看sun.misc.Launcher.AppClassLoader的源碼我們可以看到,它會讀取java.class.path這個配置來獲取那些地址加載類資源。參考以下代碼示例,利用jsp和jcmd兩個命令可以進行驗證。
代碼示例:
public class HelloWord {
public static void main(String[] args) throws IOException {
System.out.println("Hello Word");
System.in.read();
}
}
jsp命令可以查看本機Java進程,jcmd命令可以查看運行時配置:jcmd 進程號 VM.system_properties
Java中的類并不會重復加載,同一類加載器,同一類名,代表的是同一個類。而避免類重復加載的主要原因在于JVM在加載類時默認采用的是雙親委派模型。所謂的雙親委派模型,就是某個特定的類加載器在接到類的加載請求時,首先將加載任務委托給父加載器,依次遞歸,如果父加載器可以完成類加載任務,就成功返回;只有父加載器無法完成此加載任務時,才自己去加載。由下到上逐級委托,由上到下逐級查找,雙親委派模型保證了Java核心庫的類型安全
JVM中的類不可能一直存在,在滿足一定條件的情況下類會被卸載掉。在滿足該Class的所有實例都已被垃圾回收,同時加載該類的ClassLoader實例也已經被垃圾回收,那么這個類會被JVM卸載掉。在JVM啟動中增加-verbose:class參數,可以輸出類加載和卸載的日志信息。
上述就是小編為大家分享的Java中如何實現類加載機制了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。