大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 職業(yè)指南 比較代表性的jvm加載器面試題及答案

比較代表性的jvm加載器面試題及答案

更新時(shí)間:2023-02-03 11:23:09 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1554次

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è)上給予大家一些幫助:

jvm加載器面試題及答案

1、Class.forName 和 ClassLoader.loadClass 都能加載類,這兩者在加載類時(shí)的區(qū)別?

  • Class.forName有重載方法可以指定是否需要初始化,而默認(rèn)的方法初始化設(shè)置為true這會(huì)初始化類執(zhí)行鏈接和初始化操作
  • ClasaLoader是有類加載器的loadClass方法加載,傳入的是false,只會(huì)執(zhí)行連接操作,不會(huì)初始化操作

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ì)加載的類進(jìn)行初始化,設(shè)置為true時(shí)會(huì)類進(jìn)行初始化,代表會(huì)執(zhí)行類中的靜態(tài)代碼塊,以及對(duì)靜態(tài)變量的賦值等操作。Class.forName加載類是將類進(jìn)了初始化,而ClassLoader的loadClass并沒(méi)有對(duì)類進(jìn)行初始化,只是把類加載到了虛擬機(jī)中

2、什么叫類加載器

虛擬機(jī)把描述類的數(shù)據(jù)文件(字節(jié)碼)加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證、準(zhǔn)備、解析以及類初始化,最終形成可以被虛擬機(jī)直接使用的java類型(java.lang.Class對(duì)象)。

3、類的生命周期

加載過(guò)程:通過(guò)一個(gè)類的全限定名來(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è)類的java.lang.Class對(duì)象,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)的訪問(wèn)入口;

找到類文件(通過(guò)類的全限定名來(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è)代表此類的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ò)程:正式為類屬性分配內(nèi)存并設(shè)置類屬性初始值的階段,這些內(nèi)存都將在方法區(qū)中進(jìn)行分配

解析階段:虛擬機(jī)將常量池內(nèi)的符號(hào)引用替換為直接引用的過(guò)程

初始化階段:類初始化階段是類加載過(guò)程的最后一步。初始化階段就是執(zhí)行類構(gòu)造器()方法的過(guò)程

使用階段:

卸載階段:

4、類加載器

類加載器負(fù)責(zé)加載所有的類,同一個(gè)類(一個(gè)類用其全限定類名(包名加類名)標(biāo)志)只會(huì)被加載一次。

  1. Bootstrap ClassLoader:根類加載器,負(fù)責(zé)加載java的核心類,它不是java.lang.ClassLoader的子類,而是由JVM自身實(shí)現(xiàn)
  2. Extension ClassLoader:擴(kuò)展類加載器,擴(kuò)展類加載器的加載路徑是JDK目錄下jre/lib/ext,擴(kuò)展類的getParent()方法返回null,實(shí)際上擴(kuò)展類加載器的父類加載器是根加載器,只是根加載器并不是Java實(shí)現(xiàn)的
  3. Application ClassLoader:應(yīng)用程序類加載器,它負(fù)責(zé)在JVM啟動(dòng)時(shí)加載來(lái)自java命令的-classpath選項(xiàng)、java.class.path系統(tǒng)屬性或CLASSPATH環(huán)境變量所指定的jar包和類路徑。程序可以通過(guò)getSystemClassLoader()來(lái)獲取系統(tǒng)類加載器。系統(tǒng)加載器的加載路徑是程序運(yùn)行的當(dāng)前路徑。

雙親委派模型的工作過(guò)程

  1. 先查找當(dāng)前ClassLoader是否加載過(guò)此類,有就返回;
  2. 如果沒(méi)有,查詢父ClassLoader是否已經(jīng)加載過(guò)此類,如果已經(jīng)加載過(guò),就直接返回Parent加載的類;
  3. 如果整個(gè)類加載器體系上的ClassLoader都沒(méi)有加載過(guò),才由當(dāng)前ClassLoader加載(調(diào)用findClass),整個(gè)過(guò)程類似循環(huán)鏈表一樣。

雙親委托機(jī)制的作用

  1. 共享功能:可以避免重復(fù)加載,當(dāng)父親已經(jīng)加載了該類的時(shí)候,子類不需要再次加載,一些Framework層級(jí)的類一旦被頂層的ClassLoader加載過(guò)就緩存在內(nèi)存里面,以后任何地方用到都不需要重新加載。
  2. 隔離功能:java核心類庫(kù)的純凈和安全,防止惡意加載。

如何打破雙親委派模型?

  1. 雙親委派模型的邏輯都在loadClass()中,重寫(xiě)loaderClass()、findClass()
  2. 系統(tǒng)自帶的三個(gè)類加載器都加載特定目錄下的類,如果我們自己的類加載器放在一個(gè)特殊的目錄,那么系統(tǒng)的加載器就無(wú)法加載,也就是最終還是由我們自己的加載器加載

打破雙親委派

“雙親委派”機(jī)制只是Java推薦的機(jī)制,并不是強(qiáng)制的機(jī)制。

比如JDBC就打破了雙親委派機(jī)制。它通過(guò)Thread.currentThread().getContextClassLoader()得到線程上下文加載器來(lái)加載Driver實(shí)現(xiàn)類,從而打破了雙親委派機(jī)制。

自定義ClassLoader

  1. loadClass(String name,boolean resolve):根據(jù)指定的二進(jìn)制名稱加載類
  2. findClass(String name): 根據(jù)二進(jìn)制名稱來(lái)查找類
  3. 直接使用或繼承已有的ClassLoader實(shí)現(xiàn):java.net.URLClassLoader、java.security.SecureClassLoader、 java.rmi.server.RMIClassLoader
  4. 在調(diào)用loadClass(),會(huì)先根據(jù)委派模型在父加載器中加載,如果加載失敗,則會(huì)調(diào)用自己的findClass方法來(lái)完成加載

5、引起類加載操作的五個(gè)行為

遇到new、getstatic、putstatic或invokestatic這四條字節(jié)碼指令

反射調(diào)用的時(shí)候,如果類沒(méi)有進(jìn)行過(guò)初始化,則需要先觸發(fā)其初始化

子類初始化的時(shí)候,如果其父類還沒(méi)初始化,則需先觸發(fā)其父類的初始化

虛擬機(jī)執(zhí)行主類的時(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)。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 免费观看一级欧美在线视频 | 狠狠插天天干 | 精品国产一区二区三区香蕉事 | 国产不卡在线观看 | 国产精品久久毛片蜜月 | 国产一区二区三区在线影院 | 亚洲成a v人片在线观看 | 桃花福利视频在线观看 | 美女hdxxxx中国 | 日本一区二区三区不卡在线视频 | 热综合一本伊人久久精品 | 国产高清精品自在久久 | 久久久噜噜噜www成人网 | 国内精品视频一区 | 免费一级欧美大片视频在线 | 美女又黄又免费视频 | 牛牛影视免费观看成人 | 一级特黄性色生活片一区二区 | 天天操天天操天天操天天操 | 久久777国产线看观看精品卜 | 一级日本高清视频免费观看 | 人人97| 在线综合+亚洲+欧美中文字幕 | 91精品国产福利尤物 | 成年女人视频网站免费m | 狠狠色丁香久久婷婷综 | 亚洲精品高清在线一区二区三区 | 欧美综合天天夜夜久久 | 国产成人一区二区视频在线观看 | 欧洲精品视频在线观看 | 国产99视频精品免费视频免里 | 国产999视频 | 国产久视频观看 | 免费看成人毛片日本久久 | 国产成人综合久久精品红 | 亚洲一级视频在线观看 | 国产精品99一区二区三区 | 不卡猪 | 欧美成人午夜视频免看 | 国产99久久九九精品免费 | 中文字幕一区二区精品区 |