| 失效鏈接處理 |
|
2020年攜程Java高級(jí)筆試面試題 PDF 下載
本站整理下載:
提取碼:nrj6
相關(guān)截圖:
![]()
主要內(nèi)容:
1. 描述一下 JVM 加載 Class 文件的原理機(jī)制?
在面試 java 工程師的時(shí)候,這道題經(jīng)常被問(wèn)到,故需特別注意。
Java 中的所有類,都需要由類加載器裝載到 JVM 中才能運(yùn)行。類加
載器本身也是一個(gè)類,而它的工作就是把 class 文件從硬盤讀取到內(nèi)
存中。在寫程序的時(shí)候,我們幾乎不需要關(guān)心類的加載,因?yàn)檫@些都
是隱式裝載的,除非我們有特殊的用法,像是反射,就需要顯式的加
載所需要的類。
Java 類的加載是動(dòng)態(tài)的,它并不會(huì)一次性將所有類全部加載后再運(yùn)
行,而是保證程序運(yùn)行的基礎(chǔ)類(像是基類)完全加載到 jvm 中,至于
其他類,則在需要的時(shí)候才加載。這當(dāng)然就是為了節(jié)省內(nèi)存開(kāi)銷。
Java 的類加載器有三個(gè),對(duì)應(yīng) Java 的三種類:
三個(gè)加載器各自完成自己的工作,但它們是如何協(xié)調(diào)工作呢?哪一個(gè)類該由哪個(gè)類加載器完
成呢?為了解決這個(gè)問(wèn)題,Java 采用了委托模型機(jī)制。
委托模型機(jī)制的工作原理很簡(jiǎn)單:當(dāng)類加載器需要加載類的時(shí)候,先請(qǐng)示其 Parent(即上一
層加載器)在其搜索路徑載入,如果找不到,才在自己的搜索路徑搜索該類。這樣的順序其
實(shí)就是加載器層次上自頂而下的搜索,因?yàn)榧虞d器必須保證基礎(chǔ)類的加載。之所以是這種機(jī)
制,還有一個(gè)安全上的考慮:如果某人將一個(gè)惡意的基礎(chǔ)類加載到 jvm,委托模型機(jī)制會(huì)搜
索其父類加載器,顯然是不可能找到的,自然就不會(huì)將該類加載進(jìn)來(lái)。
我們可以通過(guò)這樣的代碼來(lái)獲取類加載器:注意一個(gè)很重要的問(wèn)題,就是 Java 在邏輯上并不存在 BootstrapKLoader 的實(shí)
體!因?yàn)樗怯?C++編寫的,所以打印其內(nèi)容將會(huì)得到 null。
前面是對(duì)類加載器的簡(jiǎn)單介紹,它的原理機(jī)制非常簡(jiǎn)單,就是下面幾個(gè)步驟:
1.裝載:查找和導(dǎo)入 class 文件;
2.連接:
3. 初始化:初始化靜態(tài)變量,靜態(tài)代碼塊。
來(lái)源:https://www.cnblogs.com/wenjiang/archive/2013/04/26/3044132.html
2. 什么是類加載器?
類加載器是一個(gè)用來(lái)加載類文件的類。Java 源代碼通過(guò) javac 編譯器編譯成類
文件。然后 JVM 來(lái)執(zhí)行類文件中的字節(jié)碼來(lái)執(zhí)行程序。類加載器負(fù)責(zé)加載文件
系統(tǒng)、網(wǎng)絡(luò)或其他來(lái)源的類文件。
3. 類加載器有哪些?
有三種默認(rèn)使用的類加載器:Bootstrap 類加載器、Extension 類加載器和
Application 類加載器。每種類加載器都有設(shè)定好從哪里加載類。Bootstrap 類加載器負(fù)責(zé)加載 rt.jar 中的 JDK 類文件,它是所有類加載器的父加
載 器 。 Bootstrap 類 加 載 器 沒(méi) 有 任 何 父 類 加 載 器 , 如 果 你 調(diào) 用
String.class.getClassLoader() , 會(huì) 返 回 null , 任 何 基 于 此 的 代 碼 會(huì) 拋 出
NullPointerException 異常。Bootstrap 加載器被稱為初始類加載器。
|




蘇公網(wǎng)安備 32061202001004號(hào)


