閱讀本文大概需要3分鐘。
典型答案
首先,類載入器屬於JVM的類載入子系統,常見的類載入器有:Bootstrap classloader、ExtClassloader、AppClassloader,還有使用者自定義的類載入器。Bootstrap classloader是C++編寫的啟動類載入器,負責載入java.lang.*
開頭的類;ExtClassloader是擴充套件類載入器,負責載入JVM擴充套件類,比如swing系列、xml解析器等等,這些庫的的jar包位於JAVA_HOME/lib/ext目錄下。
第二,類載入器負責將.class格式的位元組碼檔案或來自網路上的位元組碼流讀取到JVM中執行。類載入的過程是按需載入的,因為Java是一門動態編譯語言,所謂動態編譯語言指的是不需要在開始執行前就構成一個完整的可執行檔案。
-
C/C++屬於靜態編譯語言,需要將程式中所有的子模組都打包在一起構成一個可執行檔案。將不同模組的程式碼合併到一個可執行檔案的過程指的是連結。
-
Java程式碼執行的過程也跟C/C++不同,在Java中,原始碼會被javac編譯為.class檔案,在被載入到JVM中之前都不會進行連結——也就是說,Java程式的連結是在JVM裡執行時進行的。Java應用執行的時候,會按照需要載入對應的類——如果一個類依賴於另一個類,則在載入這個類之前要先載入它依賴的那個類(這個按需載入的過程就是動態編譯)。
問題分析
這個問題的關鍵點有二:(1)類載入的定義是什麼;(2)類載入器的作用是什麼。
如果能回答清楚這兩個點,面試官如果想考察你對JVM的理解的深度,就會從這裡開始,展開進一步的追問,例如:(1)所謂的雙親委派機制是什麼意思?(2)是否瞭解執行緒背景關係載入器?(3)描述下一個類的載入過程;(4)一個類在被載入到JVM後,還有機會被改變嗎?(5)是否在生產中遇到過類載入相關的問題,是怎麼排查、分析和解決的? 如果能夠在接下來的這幾個問題中侃侃而談,那麼說明候選人對類載入器這塊的知識的掌握深度是過關的。
知識點梳理
關於類載入器,有幾個關鍵的知識點需要掌握(在此不做展開,有一篇相關的文章正在過程中,大家敬請期待)。
-
類載入的過程
-
類載入器的型別
-
雙親委派機制
-
執行緒背景關係載入器(打破雙親委派機制)
-
類載入在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
-
◆ ◆ ◆