本文首發(fā)于公眾號:javaadu
典型答案
類加載器屬于JVM的類加載子系統(tǒng)永高,常見的類加載器有:Bootstrap classloader、ExtClassloader对供、AppClassloader铺纽,還有用戶自定義的類加載器。Bootstrap classloader是C++編寫的啟動類加載器枚钓,負責加載java.lang.*
開頭的類铅搓;ExtClassloader是擴展類加載器,負責加載JVM擴展類,比如swing系列搀捷、xml解析器等等狸吞,這些庫的的jar包位于JAVA_HOME/lib/ext目錄下。
類加載器負責將.class格式的字節(jié)碼文件或來自網(wǎng)絡上的字節(jié)碼流讀取到內(nèi)存中指煎。類加載的過程是按需加載的,因為Java是一門動態(tài)編譯語言便斥,所謂動態(tài)編譯語言指的是不需要在開始運行前就構(gòu)成一個完整的可執(zhí)行文件至壤。
C/C++屬于靜態(tài)編譯語言,需要將程序中所有的子模塊都打包在一起構(gòu)成一個可執(zhí)行文件枢纠。將不同模塊的代碼合并到一個可執(zhí)行文件的過程指的是鏈接像街。
Java代碼執(zhí)行的過程也跟C/C++不同,在Java中晋渺,源代碼會被javac編譯為.class文件镰绎,在被加載到JVM中之前都不會進行鏈接——也就是說,Java程序的鏈接是在JVM里運行時進行的木西。Java應用運行的時候畴栖,會按照需要加載對應的類——如果一個類依賴于另一個類,則在加載這個類之前要先加載它依賴的那個類(這個按需加載的過程就是動態(tài)編譯)八千。
問題分析
這個問題的關(guān)鍵點有二:(1)類加載的定義是什么吗讶;(2)類加載器的作用是什么燎猛。
如果能回答清楚這兩個點,面試官如果想考察你對JVM的理解的深度照皆,就會從這里開始重绷,展開進一步的追問,例如:(1)所謂的雙親委派機制是什么意思膜毁?(2)是否了解線程上下文加載器昭卓?(3)描述下一個類的加載過程;(4)一個類在被加載到JVM后瘟滨,還有機會被改變嗎候醒?(5)是否在生產(chǎn)中遇到過類加載相關(guān)的問題,是怎么排查室奏、分析和解決的火焰? 如果能夠在接下來的這幾個問題中侃侃而談,那么說明候選人對類加載器這塊的知識的掌握深度是過關(guān)的胧沫。
知識點梳理
關(guān)于類加載器昌简,有幾個關(guān)鍵的知識點需要掌握(在此不做展開,有一篇相關(guān)的文章正在過程中绒怨,大家敬請期待)纯赎。
類加載的過程
類加載器的類型
雙親委派機制
線程上下文加載器(打破雙親委派機制)
類加載在java agent中的應用
osgi和模塊化
參考資料
https://stackoverflow.com/questions/2424604/what-is-a-java-classloader
https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-5.html
《深入理解JVM虛擬機》
本號專注于后端技術(shù)、JVM問題排查和優(yōu)化南蹂、Java面試題犬金、個人成長和自我管理等主題,為讀者提供一線開發(fā)者的工作和成長經(jīng)驗六剥,期待你能在這里有所收獲晚顷。