一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JVM系列(三):雙親委派機(jī)制筆記

 IT技術(shù)分享社區(qū) 2022-10-20 發(fā)布于江蘇
               

1、Java類加載的過程

Java類的加載過程是動態(tài)的,它不會一次性把程序所有的類全部加載后再運(yùn)行,而是先保障程序運(yùn)行的基礎(chǔ)類加載到JVM虛擬機(jī)當(dāng)中,其他的類,一般是再需要的時候才會去加載,這樣的運(yùn)行機(jī)制也達(dá)到了節(jié)約內(nèi)存的目的。
當(dāng)JVM虛擬機(jī)加載某個class文件的時候,采用的是雙親委派模式(任務(wù)委派模式),就是將請求交給父類去處理。

2、類裝載的方式

隱式裝載:程序在運(yùn)行過程中當(dāng)碰到通過new 等方式生成對象時,隱式調(diào)用類裝載器加載對應(yīng)的類到JVM中。
顯式裝載:通過class.forName()等方法,顯式加載需要的類

3、雙親委派機(jī)制的概念

雙親委派機(jī)制是指當(dāng)一個類加載器收到某個類加載請求時,該類加載器首先會把請求委派給父類加載器。每個類加載器都是如此,它會先委托父類加載器在自己的搜索范圍內(nèi)找不到對應(yīng)的類時,該類加載器才會嘗試自己去加載。

4、雙親委派模式的工作流程

               
Application ClassLoader 收到一個類加載請求時,首先它自己不會先去嘗試加載這個類,而是先將這個加載請求委派給父類加載器Extension ClassLoader去加載。 
如果Extension ClassLoader收到一個類加載請求時,先將加載請求委派給父類加載器Bootstrap ClassLoader去完成。 
如果Bootstrap ClassLoader加載失敗(在<JAVA_HOME>\lib中未找到所需類),就會讓Extension ClassLoader嘗試加載,如果加載成功了就不再讓Extension ClassLoader加載,過程結(jié)束。 
如果Extension ClassLoader也加載失敗,就會使用Application ClassLoader加載如果加載成功了就不再讓Application ClassLoader加載,過程結(jié)束。 
如果Application ClassLoader也加載失敗,就會使用自定義加載器去嘗試加載。 
如果所有的加載都失敗了,就會拋出ClassNotFoundException異常。
理解:執(zhí)行的情況都是由Bootstrap ClassLoader先加載,失敗了輪到Extension ClassLoader加載,再失敗了輪到Application ClassLoader,最后輪到自定義加載器加載。一般情況下大家寫的java程序都是Application ClassLoader進(jìn)行加載的。

5、雙親委派模型的核心代碼


protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// 首先,檢查這類是否已經(jīng)被加載過了
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
//如果存在父類加載器,則取找該類的父類加載器
c = parent.loadClass(name, false);
} else {
//返回由引導(dǎo)類加載器加載的類;如果未找到,則返回 null。
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// 如果父類加載器拋出ClassNotFoundException異常
// 則說明父類加載器無法完成加載請求
}

if (c == null) {
// 在父類加載器無法加載時
// 再調(diào)用本身的findClass方法來進(jìn)行加載
long t1 = System.nanoTime();
c = findClass(name);

// 這是定義類加載器;記錄統(tǒng)計(jì)數(shù)據(jù)
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}

6、雙親委派機(jī)制的作用

防止加載同一個class文件。通過委托的方式去詢問父級是否已經(jīng)加載過該class,如果加載過了就不需要重新加載。從而保證了數(shù)據(jù)安全。
通過委托的方式,保證Java核心class不被篡改,即使被篡改也不會被加載,即使被加載也不會是同一個class對象,因?yàn)椴煌募虞d器加載同一個.class也不是同一個Class對象。這樣則保證了Class的執(zhí)行安全。

IT技術(shù)分享社區(qū)

個人博客網(wǎng)站:https://

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    在线视频免费看你懂的| 欧美激情一区=区三区| 国产专区亚洲专区久久| 亚洲天堂精品一区二区| 高中女厕偷拍一区二区三区| 九九久久精品久久久精品| 真实国产乱子伦对白视频不卡| 黑鬼糟蹋少妇资源在线观看| 国产一区二区精品高清免费 | 亚洲国产四季欧美一区| 国产精品视频久久一区| 久久99午夜福利视频| 少妇熟女精品一区二区三区| 一本色道久久综合狠狠躁| 国内精品美女福利av在线| 日韩精品视频香蕉视频| 中国美女草逼一级黄片视频| 国产一区二区三区香蕉av| 日本高清不卡一二三区| 国产免费无遮挡精品视频 | 日韩国产亚洲一区二区三区| 内射精子视频欧美一区二区| 欧美日韩免费黄片观看| 中文字幕精品一区二区三| 午夜福利92在线观看| 蜜臀人妻一区二区三区| 国产不卡视频一区在线| 亚洲国产一区精品一区二区三区色| 亚洲中文字幕高清乱码毛片| 欧美日韩一区二区三区色拉拉| 国产精品熟女在线视频| 日本高清一区免费不卡| 中文字幕人妻一区二区免费| 老司机精品国产在线视频| 国产亚洲精品一二三区| 色一情一伦一区二区三| 亚洲欧美日本视频一区二区| 精品欧美国产一二三区| 国产一区二区三区香蕉av| 高清不卡视频在线观看| 亚洲一区二区三区一区|