黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專(zhuān)注Java教育14年 全國(guó)咨詢(xún)/投訴熱線: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) 瀏覽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è)上給予大家一些幫助:

jvm加載器面試題及答案

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

  • Class.forName有重載方法可以指定是否需要初始化,而默認(rèn)的方法初始化設(shè)置為true這會(huì)初始化類(lèi)執(zhí)行鏈接和初始化操作
  • ClasaLoader是有類(lèi)加載器的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ì)加載的類(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ì)被加載一次。

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

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

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

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

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

如何打破雙親委派模型?

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

打破雙親委派

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

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

自定義ClassLoader

  1. loadClass(String name,boolean resolve):根據(jù)指定的二進(jìn)制名稱(chēng)加載類(lèi)
  2. findClass(String name): 根據(jù)二進(jìn)制名稱(chēng)來(lái)查找類(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、引起類(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)。

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

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 黄色短视频免费在线观看 | 2020久久精品国产免费 | 黄色片国产 | 欧美成人私人视频88在线观看 | 免费在线一级片 | 色播日韩 | 你懂的在线免费视频 | 黄色日韩 | 国产亚洲欧美久久精品 | 污黄视频在线看 | 国产精品视频一区二区三区不卡 | 日韩射| 91好色视频 | 狼人香蕉网 | 精品播放 | 欧美一区二区三区激情视频 | 亚洲第一色网 | 日本免费黄网 | 欧美video巨大粗暴多人 | 性感美女香蕉视频 | 国产精品欧美激情第一页 | 日韩女同一区二区三区 | 欧美日韩高清一区 | 你懂得在线播放 | 中文字幕欧美在线观看 | 中国高清videossex免费 | 中国黄色网页 | 亚洲天堂网在线播放 | 亚洲一区二区高清 | 日韩国产欧美一区二区三区 | 成 人在线观看视频网站 | 亚洲国产成人精品一区91 | bbbb成人毛片免费看 | 免费观看欧美一级片 | 深夜福利剧场 | 成人欲涩漫h漫免费动漫 | 成 人在线观看视频网站 | 日韩在线手机看片免费看 | 国产丝袜视频在线观看 | 天天操操操操操 | 久久婷婷一区二区三区 |