歡迎光臨
每天分享高質量文章

006-類加載器在Java中扮演的角色是什麼

音樂資源加載中…

閱讀本文大概需要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)是否在生產中遇到過類加載相關的問題,是怎麼排查、分析和解決的? 如果能夠在接下來的這幾個問題中侃侃而談,那麼說明候選人對類加載器這塊的知識的掌握深度是過關的。

知識點梳理

關於類加載器,有幾個關鍵的知識點需要掌握(在此不做展開,有一篇相關的文章正在過程中,大家敬請期待)。

  1. 類加載的過程

  1. 類加載器的型別

  1. 雙親委派機制

  1. 執行緒背景關係加載器(打破雙親委派機制)

  1. 類加載在java agent中的應用

  1. osgi和模塊化

參考資料

  1. https://stackoverflow.com/questions/2424604/what-is-a-java-classloader

  2. https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-5.html

  3. 《深入理解JVM虛擬機》

  

 

往期精彩回顧
003-005:Java平臺相關的面試題

002-如何理解Java的平臺獨立性

001-為什麼Java能這麼流行

ThreadLocal:Java中的影分身

    閱讀原文

    赞(0)

    分享創造快樂