您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“JVM類的加載過程和雙親委派模型案例分享”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“JVM類的加載過程和雙親委派模型案例分享”吧!
類加載過程為 JVM 將類描述數(shù)據(jù)從 .class 文件中加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行解析和初始化,最終形成被JVM直接使用的 Java 類型。包含:
?加載:獲取該類的二進(jìn)制字節(jié)流,將字節(jié)流代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時數(shù)據(jù)結(jié)構(gòu),并在內(nèi)存生成代表該類的 java.lang.Object 對象作為方法區(qū)該類的訪問入口?驗證:確保 Class 文件的字節(jié)流中包含的信息符號當(dāng)前虛擬機(jī)的要求(文件格式驗證、元數(shù)據(jù)驗證、字節(jié)碼驗證、符號引用驗證)?準(zhǔn)備:為類變量分配內(nèi)存并設(shè)置類變量初始值?解析:將常量池內(nèi)的符號引用替換為直接引用?初始化:執(zhí)行類構(gòu)造器<client>
類加載過程中的加載操作由類加載去完成。類加載器分為:
?啟動類加載器/Bootstrap ClassLoader:負(fù)責(zé)加載 JAVA_HOME/lib 目錄中的所有類,或者加載由選項 -Xbootcalsspath 指定的路徑下的類;?擴(kuò)展類加載器/ExtClasLoader:負(fù)責(zé)加載 JAVA_HOME/lib/ext 目錄中的所有類型,或者由參數(shù)-Xbootclasspath指定路徑中的所有類型;?應(yīng)用程序類加載器/AppClassLoader:負(fù)責(zé)加載用戶類路徑 ClassPath 下的所有類型?自定義加載器:所有繼承抽象類 java.lang.ClassLoader 的類加載器
雙親委派過程:當(dāng)一個類加載器收到類加載任務(wù)時,立即將任務(wù)委派給它的父類加載器去執(zhí)行,直至委派給最頂層的啟動類加載器為止。如果父類加載器無法加載委派給它的類時,將類加載任務(wù)退回給它的下一級加載器去執(zhí)行。
雙親委派模型最大的好處就是讓Java類同其類加載器一起具備了一種帶優(yōu)先級的層次關(guān)系。舉個例子來說明下:比如我們要加載頂層的Java類——java.lang.Object類,無論我們用哪個類加載器去加載Object類,這個加載請求最終都會委托給啟動類加載器(Bootstrap ClassLoader),這樣就保證了所有加載器加載的Object類都是同一個類。如果沒有雙親委派模型,就會出現(xiàn) Wupx::Object 和 Huyx::Object 這樣兩個不同的Object類。
java.lang.ClassLoader 的 loadClass() 方法
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // First, check if the class has already been loaded Class<?> c = findLoadedClass(name); if (c == null) { long t0 = System.nanoTime(); try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader } if (c == null) { // If still not found, then invoke findClass in order // to find the class. long t1 = System.nanoTime(); c = findClass(name); // this is the defining class loader; record the stats sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); sun.misc.PerfCounter.getFindClasses().increment(); } } if (resolve) { resolveClass(c); } return c; } }
到此,相信大家對“JVM類的加載過程和雙親委派模型案例分享”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。