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