摘要:類加載器三杰有三類,分別是以及。線程上下文類加載器線程上下文類加載器可以不遵循雙親委派機(jī)制。免費(fèi)領(lǐng)取驗(yàn)證碼內(nèi)容安全短信發(fā)送直播點(diǎn)播體驗(yàn)包及云服務(wù)器等套餐更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營經(jīng)驗(yàn)分享請(qǐng)?jiān)L問網(wǎng)易云社區(qū)。文章來源網(wǎng)易云社區(qū)
本文由作者張遠(yuǎn)道授權(quán)網(wǎng)易云社區(qū)發(fā)布。
類加載器三杰
jvm有三類classloader,分別是bootstrap classloader,extended classloader以及system classloader。
bootstrap classloader是系統(tǒng)在啟動(dòng)jvm時(shí)默認(rèn)加載的。當(dāng)用戶在命令行輸入java Test時(shí),系統(tǒng)會(huì)首先加載jvm。在windows系統(tǒng)下,jvm的路徑通常位于%JAVA_HOME%/jdk/jre/client/jvm.dll和%JAVA_HOME%/jdk/jre/server/jvm.dll.
bootstrap classloader加載后,會(huì)載入extended classloader,并將extended classloader的父類設(shè)為bootstrap classloader。然后,bootstrap classloader接著載入system classloader,并將system classloader的父類設(shè)為extended classloader。至此,bootstrap--extended--system三級(jí)繼承結(jié)構(gòu)形成。
bootstrap classloader在jvm啟動(dòng)之后自動(dòng)加載。bootstrap classloader由c實(shí)現(xiàn),不屬于java類。
extended classloader由java實(shí)現(xiàn),通常為sun.misc.Lancher$ExtClassLoader.
system classloader由java實(shí)現(xiàn),通常為sun.misc.Lancher$AppClassLoader.
其中,
bootstrap classloader負(fù)責(zé)加載sun.boot.class.path路徑下的.class文件以及jar包。
extended classloader負(fù)責(zé)加載java.ext.dirs路徑下的.class文件以及jar包。
system classloader負(fù)責(zé)加載java.class.path路徑下的.class文件以及jar包。
sun.boot.class.path通常對(duì)應(yīng)環(huán)境變量CLASSPATH的路徑。
java.ext.dirs通常對(duì)應(yīng)JAVA_HOME/jre/lib/ext目錄。
java.class.path對(duì)應(yīng)用戶自身的類路徑。
類加載到何處
據(jù)可靠情報(bào),jvm由方法區(qū),堆,棧,pc寄存器和本地方法棧構(gòu)成。類加載器的任務(wù)就是將class二進(jìn)制文件加載到方法區(qū),供虛擬機(jī)模制出在堆中存放的對(duì)象。
雙親委托機(jī)制
classloader加載類的過程為:
檢查被加載類是否被加載。
如果沒有被加載則調(diào)用父classloader加載該類。
如果1、2不成功,則仍由自身進(jìn)行類加載。
這種機(jī)制又叫雙親委派機(jī)制。
雙親委派機(jī)制的好處是,避免多個(gè)類加載器加載同一個(gè)類的不同拷貝到內(nèi)存(jvm的方法區(qū))中。因?yàn)槿绻怉由ClassLoaderA加載,同時(shí),又被ClassLoaderB加載,這樣,內(nèi)存中就會(huì)存在兩份不同的A的定義,于是形成A既是ClassLoaderA罩的,又是ClassLoaderB罩著,造成災(zāi)難性后果。
用戶自定義類的加載順序通常為:
首先調(diào)用AppClassLoader加載類,AppClassLoader調(diào)用ExtClassLoader,ExtClassLoader調(diào)用BootClassLoader,BootClassLoader在sun.boot.class.path尋找改類,沒找到,加載失敗;ExtClassLoader也未加載類,失敗,最后由AppClassLoader加載成功。從這個(gè)加載順序可以看出來,三個(gè)類加載器的對(duì)類的可見性是不同的。
java中的類是由java的全名以及類的classloader來限定的。只有當(dāng)二者完全一樣才會(huì)認(rèn)為是同一個(gè)類。否則是不同的類。因此,可以定義一個(gè)同名的類,包名也一樣,只要保證該類被不同的類加載器加載即可。
當(dāng)前類加載器和線程上下文類加載器
當(dāng)前類加載器
當(dāng)前類加載器是指當(dāng)前方法所在的類使用的類加載器。在程序中使用Class.forName或者Class.getResource抑或Class.class時(shí)就是使用的該類加載器。
線程上下文類加載器
線程上下文類加載器可以不遵循雙親委派機(jī)制。線程的上下文類加載器有Thread.currentThread().setContextClassLoader()來為當(dāng)前線程設(shè)置線程上下文類加載器。如果沒有設(shè)置當(dāng)前線程的上下文類加載器,則繼承父類的上下文類加載器。
為什么還需要線程上下文類加載器?
考慮一種情況,當(dāng)我們的程序必須由jvm的核心代碼去加載第三方類的時(shí)候。比如jndi,jndi的核心是rt.jar包中實(shí)現(xiàn)的,由Bootstrap classloader負(fù)責(zé)加載,但是jndi必須加載第三方廠商的具體的jndi實(shí)現(xiàn),這個(gè)時(shí)候調(diào)用Bootstrap加載只對(duì)其子類加載器可見的類,就會(huì)出現(xiàn)失敗。這個(gè)時(shí)候就可以使用線程上下文類加載器。
免費(fèi)領(lǐng)取驗(yàn)證碼、內(nèi)容安全、短信發(fā)送、直播點(diǎn)播體驗(yàn)包及云服務(wù)器等套餐
更多網(wǎng)易技術(shù)、產(chǎn)品、運(yùn)營經(jīng)驗(yàn)分享請(qǐng)?jiān)L問網(wǎng)易云社區(qū)。
文章來源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/25357.html
摘要:而熱部署技術(shù)能夠幫助開發(fā)人員減少重新部署的等待時(shí)間。本文的目的為調(diào)研熱部署的技術(shù)現(xiàn)狀及其對(duì)開發(fā)效率的幫助,并簡(jiǎn)單梳理其技術(shù)實(shí)現(xiàn)的難點(diǎn)。熱部署技術(shù)總結(jié)熱部署目前有多種技術(shù)實(shí)現(xiàn)官方開源商業(yè)。 開發(fā)、自測(cè)、聯(lián)調(diào)期間代碼可能會(huì)被頻繁地修改,通常即使只增加了一行代碼,都需要重啟容器以檢查執(zhí)行效果。而熱部署技術(shù)能夠幫助開發(fā)人員減少重新部署的等待時(shí)間。本文的目的為調(diào)研熱部署的技術(shù)現(xiàn)狀及其對(duì)開發(fā)效率的...
摘要:需要注意的是對(duì)于方法或者代碼塊,當(dāng)出現(xiàn)異常時(shí),會(huì)自動(dòng)釋放當(dāng)前線程占用的鎖,因此不會(huì)由于異常導(dǎo)致出現(xiàn)死鎖現(xiàn)象。用于實(shí)現(xiàn)線程間的通信,它是為了解決難以使用的問題。 速度StringBuilder>StringBuffer>String,StringBuffer線程安全 線程安全的集合有:Vector、Stack、HashTable、ConcurrentHashMap、 CopyOnWr...
摘要:同時(shí)也有一些兒高級(jí)的處理,比如批處理更新事務(wù)隔離和可滾動(dòng)結(jié)果集等。連接對(duì)象表示通信上下文,即,與數(shù)據(jù)庫中的所有的通信是通過此唯一的連接對(duì)象。因?yàn)槭轻槍?duì)類的關(guān)系而言,所以一個(gè)對(duì)象對(duì)應(yīng)多個(gè)類的實(shí)例化。返回表示查詢返回表示其它操作。 JDBC是什么? JDBC是一個(gè)Java API,用中文可以通俗的解釋為,使用Java語言訪問訪問數(shù)據(jù)庫的一套接口集合。這是調(diào)用者(程序員)和實(shí)行者(數(shù)據(jù)庫廠商...
摘要:作用負(fù)責(zé)將加載到中審查每個(gè)類由誰加載父優(yōu)先的等級(jí)加載機(jī)制將字節(jié)碼重新解析成統(tǒng)一要求的對(duì)象格式類結(jié)構(gòu)分析為了更好的理解類的加載機(jī)制,我們來深入研究一下和他的方法。就算兩個(gè)是同一份字節(jié)碼,如果被兩個(gè)不同的實(shí)例所加載,也會(huì)認(rèn)為它們是兩個(gè)不同。 申明:本文首發(fā)于 詳細(xì)深入分析 ClassLoader 工作機(jī)制 ,如有轉(zhuǎn)載,注明原出處即可,謝謝配合。 什么是 ClassLoader ? 大家...
摘要:它們是通過來自遠(yuǎn)程的服務(wù)器的連接發(fā)送字節(jié)碼并在本地運(yùn)行,這一點(diǎn)令人興奮。中有一個(gè)自定義的,它不是從本地文件系統(tǒng)加載類文件,而是從遠(yuǎn)程服務(wù)器上獲取,通過加載原始字節(jié)碼,再在中轉(zhuǎn)化為類。它將字節(jié)碼解析為運(yùn)行時(shí)的數(shù)據(jù)結(jié)構(gòu),檢查其有效性等。 前言 Java ClassLoader是java運(yùn)行系統(tǒng)中一個(gè)至關(guān)重要但是經(jīng)常被忽略的組件。它負(fù)責(zé)在運(yùn)行時(shí)尋找并加載類文件。創(chuàng)建自定義的ClassLoad...
閱讀 874·2021-11-12 10:36
閱讀 3476·2021-09-08 10:44
閱讀 2799·2019-08-30 11:08
閱讀 1461·2019-08-29 16:12
閱讀 2735·2019-08-29 12:24
閱讀 977·2019-08-26 10:14
閱讀 758·2019-08-23 18:32
閱讀 1241·2019-08-23 17:52