更新時間:2023-02-03 11:23:09 來源:動力節(jié)點 瀏覽1574次
Java編程最大的特點就是與平臺的無關(guān)性,使用Java虛擬機來實現(xiàn)這一點是最關(guān)鍵的,所以我們在面試相關(guān)崗位的時候,JVM的相關(guān)面試題經(jīng)常被問到,今天小編就總結(jié)了一些比較有代表性的問題,希望可以在就業(yè)上給予大家一些幫助:
1、Class.forName 和 ClassLoader.loadClass 都能加載類,這兩者在加載類時的區(qū)別?
Class.forName()方法實際上也是調(diào)用的CLassLoader來實現(xiàn)的。
Class.forName(String className);這個方法的源碼是:
@CallerSensitive public static Class forName(String className) throws ClassNotFoundException { Class caller = Reflection.getCallerClass(); return forName0(className, true, ClassLoader.getClassLoader(caller), caller); }
最后調(diào)用的方法是forName0這個方法,在這個forName0方法中的第二個參數(shù)被默認設(shè)置為了true,這個參數(shù)代表是否對加載的類進行初始化,設(shè)置為true時會類進行初始化,代表會執(zhí)行類中的靜態(tài)代碼塊,以及對靜態(tài)變量的賦值等操作。Class.forName加載類是將類進了初始化,而ClassLoader的loadClass并沒有對類進行初始化,只是把類加載到了虛擬機中
2、什么叫類加載器
虛擬機把描述類的數(shù)據(jù)文件(字節(jié)碼)加載到內(nèi)存,并對數(shù)據(jù)進行驗證、準備、解析以及類初始化,最終形成可以被虛擬機直接使用的java類型(java.lang.Class對象)。
3、類的生命周期
加載過程:通過一個類的全限定名來獲取定義此類的二進制字節(jié)流,將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu)。在內(nèi)存中(方法區(qū))生成一個代表這個類的java.lang.Class對象,作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口;
找到類文件(通過類的全限定名來獲取定義此類的二進制字節(jié)流)
放入方法區(qū)(將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu))
開個入口(生成一個代表此類的java.lang.Class對象,作為訪問方法區(qū)這些數(shù)據(jù)結(jié)構(gòu)的入口)
驗證過程:為了確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機的要求,文件格式驗證、元數(shù)據(jù)驗證、字節(jié)碼驗證、符號引用驗證
準備過程:正式為類屬性分配內(nèi)存并設(shè)置類屬性初始值的階段,這些內(nèi)存都將在方法區(qū)中進行分配
解析階段:虛擬機將常量池內(nèi)的符號引用替換為直接引用的過程
初始化階段:類初始化階段是類加載過程的最后一步。初始化階段就是執(zhí)行類構(gòu)造器()方法的過程
使用階段:
卸載階段:
4、類加載器
類加載器負責(zé)加載所有的類,同一個類(一個類用其全限定類名(包名加類名)標志)只會被加載一次。
雙親委派模型的工作過程
雙親委托機制的作用
如何打破雙親委派模型?
打破雙親委派
“雙親委派”機制只是Java推薦的機制,并不是強制的機制。
比如JDBC就打破了雙親委派機制。它通過Thread.currentThread().getContextClassLoader()得到線程上下文加載器來加載Driver實現(xiàn)類,從而打破了雙親委派機制。
自定義ClassLoader
5、引起類加載操作的五個行為
遇到new、getstatic、putstatic或invokestatic這四條字節(jié)碼指令
反射調(diào)用的時候,如果類沒有進行過初始化,則需要先觸發(fā)其初始化
子類初始化的時候,如果其父類還沒初始化,則需先觸發(fā)其父類的初始化
虛擬機執(zhí)行主類的時候(有 main(string[] args))
JDK1.7 動態(tài)語言支持
以上就是“比較代表性的jvm加載器面試題及答案”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動力節(jié)點Java官網(wǎng)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743