西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴(lài)的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)java → JAVA面試常備題、JVM加載class文件的原理機(jī)制

JAVA面試常備題、JVM加載class文件的原理機(jī)制

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2013/4/26 10:27:27字體大。A-A+

作者:西西點(diǎn)擊:945次評(píng)論:0次標(biāo)簽: 地震寶寶

  • 類(lèi)型:行業(yè)軟件大。7.3M語(yǔ)言:中文 評(píng)分:10.0
  • 標(biāo)簽:
立即下載

在面試java工程師的時(shí)候,這道題經(jīng)常被問(wèn)到,故需特別注意。

Java中的所有類(lèi),都需要由類(lèi)加載器裝載到JVM中才能運(yùn)行。類(lèi)加載器本身也是一個(gè)類(lèi),而它的工作就是把class文件從硬盤(pán)讀取到內(nèi)存中。在寫(xiě)程序的時(shí)候,我們幾乎不需要關(guān)心類(lèi)的加載,因?yàn)檫@些都是隱式裝載的,除非我們有特殊的用法,像是反射,就需要顯式的加載所需要的類(lèi)。

Java類(lèi)的加載是動(dòng)態(tài)的,它并不會(huì)一次性將所有類(lèi)全部加載后再運(yùn)行,而是保證程序運(yùn)行的基礎(chǔ)類(lèi)(像是基類(lèi))完全加載到j(luò)vm中,至于其他類(lèi),則在需要的時(shí)候才加載。這當(dāng)然就是為了節(jié)省內(nèi)存開(kāi)銷(xiāo)。

Java的類(lèi)加載器有三個(gè),對(duì)應(yīng)Java的三種類(lèi):

Bootstrap Loader // 負(fù)責(zé)加載系統(tǒng)類(lèi) (指的是內(nèi)置類(lèi),像是String,對(duì)應(yīng)于C#中的System類(lèi)和C/C++標(biāo)準(zhǔn)庫(kù)中的類(lèi))
|
- - ExtClassLoader //負(fù)責(zé)加載擴(kuò)展類(lèi)(就是繼承類(lèi)和實(shí)現(xiàn)類(lèi))
|
- - AppClassLoader //負(fù)責(zé)加載應(yīng)用類(lèi)(程序員自定義的類(lèi))

三個(gè)加載器各自完成自己的工作,但它們是如何協(xié)調(diào)工作呢?哪一個(gè)類(lèi)該由哪個(gè)類(lèi)加載器完成呢?為了解決這個(gè)問(wèn)題,Java采用了委托模型機(jī)制。

委托模型機(jī)制的工作原理很簡(jiǎn)單:當(dāng)類(lèi)加載器需要加載類(lèi)的時(shí)候,先請(qǐng)示其Parent(即上一層加載器)在其搜索路徑載入,如果找不到,才在自己的搜索路徑搜索該類(lèi)。這樣的順序其實(shí)就是加載器層次上自頂而下的搜索,因?yàn)榧虞d器必須保證基礎(chǔ)類(lèi)的加載。之所以是這種機(jī)制,還有一個(gè)安全上的考慮:如果某人將一個(gè)惡意的基礎(chǔ)類(lèi)加載到j(luò)vm,委托模型機(jī)制會(huì)搜索其父類(lèi)加載器,顯然是不可能找到的,自然就不會(huì)將該類(lèi)加載進(jìn)來(lái)。

我們可以通過(guò)這樣的代碼來(lái)獲取類(lèi)加載器:


ClassLoader loader = ClassName.class.getClassLoader();
ClassLoader ParentLoader = loader.getParent();


注意一個(gè)很重要的問(wèn)題,就是Java在邏輯上并不存在BootstrapKLoader的實(shí)體!因?yàn)樗怯肅++編寫(xiě)的,所以打印其內(nèi)容將會(huì)得到null。
前面是對(duì)類(lèi)加載器的簡(jiǎn)單介紹,它的原理機(jī)制非常簡(jiǎn)單,就是下面幾個(gè)步驟:

1.裝載:查找和導(dǎo)入class文件;

2.連接:

(1)檢查:檢查載入的class文件數(shù)據(jù)的正確性;

(2)準(zhǔn)備:為類(lèi)的靜態(tài)變量分配存儲(chǔ)空間;

(3)解析:將符號(hào)引用轉(zhuǎn)換成直接引用(這一步是可選的)

3.初始化:初始化靜態(tài)變量,靜態(tài)代碼塊。

這樣的過(guò)程在程序調(diào)用類(lèi)的靜態(tài)成員的時(shí)候開(kāi)始執(zhí)行,所以靜態(tài)方法main()才會(huì)成為一般程序的入口方法。類(lèi)的構(gòu)造器也會(huì)引發(fā)該動(dòng)作。

    PPT圖表
    (111)PPT圖表
    我們?cè)谥谱鞲黝?lèi)的時(shí)候,或多或少的都能用到圖表。圖表它可以直觀的展示出各種信息數(shù)據(jù),有了圖表你就可以很好的將數(shù)據(jù)更直觀準(zhǔn)確的表達(dá)出來(lái)。小編在這里為大家搜集整理了一些大家可能會(huì)用到的圖表模板,歡迎有需要的各位前來(lái)下載。...更多>>

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱(chēng):
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)