溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JVM類的加載過程和雙親委派模型案例分享

發(fā)布時間:2021-09-04 10:41:10 來源:億速云 閱讀:147 作者:chen 欄目:大數(shù)據(jù)

本篇內(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 的類加載器

雙親委派模型

JVM類的加載過程和雙親委派模型案例分享

雙親委派過程:當(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í)!

向AI問一下細(xì)節(jié)

免責(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)容。

AI