前言
類的生命周期包括洞就,加載->驗(yàn)證->準(zhǔn)備->解析->初始化->使用->卸載褂微。在加載過程中果善,虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存烙荷,并對數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化虑稼,最終形成可以被虛擬機(jī)直接使用的 Java 類型琳钉。
類加載器
從JVM的角度來講,只存在兩種類加載器蛛倦,啟動類加載器(C++實(shí)現(xiàn)歌懒,加載native類,不可訪問)溯壶;另一種是其他所有類的加載器(Java實(shí)現(xiàn)及皂,獨(dú)立于虛擬機(jī)外,且全繼承自java.lang.ClassLoader)且改。
- 啟動類加載器:<JAVA_HOME>/lib验烧,不可見
- 擴(kuò)展類加載器:<JAVA_HOME>/lib/ext,可見
- 應(yīng)用程序類加載器:它根據(jù)java的類路徑來加載類又跛,一般來說碍拆,java應(yīng)用的類都是通過它來加載
JVM啟動啟動類加載器,啟動類加載器啟動擴(kuò)展類加載器和應(yīng)用程序加載器慨蓝。
雙親委派機(jī)制
雙親委派機(jī)制:
- 收到了類加載請求感混,查看自己是否已加載,否則把請求委托給父加載器菌仁,每一層都是如此浩习,所有的加載請求最終都傳遞到最頂層的類加載器進(jìn)行處理;
- 如果父加載器不存在济丘,嘗試判斷有沒有被啟動類加載器加載谱秽;
- 如果的確沒有被加載洽蛀,則再自己嘗試加載。
對相同類的判斷疟赊,不僅保證類全名相同郊供,也要求加載這個(gè)類的類加載器相同,雙親委派是為了防止出現(xiàn)全名相同近哟,但是由不同類加載器加載的情況驮审,保證類的唯一性。
打破雙親委派機(jī)制吉执,自定義類加載器疯淫,繼承ClassLoader類,重寫loadClass方法和findClass方法戳玫。
參考文章
Java虛擬機(jī)(JVM)你只要看這一篇就夠了熙掺!
一篇圖文徹底弄懂類加載器與雙親委派機(jī)制
jvm系列(一):java類的加載機(jī)制