classloader預備知識

來源:http://grid-qian.javaeye.com/blog/132136

classloader預備知識

      工作中遇到了一個ECLIPSE的classloader的問題,於是開始學習JAVA的classloader機制.學習的過程中發現,好多資料都提到 了<深入jvm>這本書.於是又下載這本書,準備看看相關的章節.打開書一看,才發現:真是不讀不知道,一讀嚇一跳.沒想到自以爲自己 JAVA學的不錯,其實好多概念都不是很清楚.於是決心從頭讀來.        看的都是些基本概念,隨便找本JAVA書都可以找到.我就不多說了.這裏就寫一些和classloader相關的基礎知識,當作引子,爲下面介紹classloader做鋪墊.        (1)JVM        JAVA體系結構詳細可以分爲四種獨立但相關的技術:        JAVA程序設計語言          JAVA CLASS文件        JAVA應用編程接口(API)        JAVA虛擬機,也就是JVM        當我們編寫一個JAVA程序,並運行之的過程就使用了這四種技術:首先,我們使用JAVA程序設計語言來設計JAVA程序,然後用編譯器把它編譯成 JAVA CLASS文件,之後就可以在JVM上運行了.在編寫JAVA程序的時候,我們需要調用一些方法來訪問系統資源.這時候就用到了JAVA API.我們通過調用JAVA API來訪問系統資源.JVM和JAVA API共同組成JAVA平臺.JAVA程序之所以可以跨平臺,就是因爲JAVA程序是運行在這些JAVA平臺之上.這些JAVA平臺給JAVA程序提供了 相同的運行環境.        JVM主要作用就是裝載class文件並執行其中的字節碼.裝載class文件就用到了classloader,而執行字節碼使由JVM的執行引擎來執行的.JVM可以包含多個classloader,這個我們以後再講.        下面來說說執行引擎.JVM可以有不同的實現方式.可以是硬件實現也可以是軟件實現.在軟件實現的JVM中,執行引擎的實現會有自己的不同之處.        最簡單的執行引擎就是一次性解釋字節碼.讀一句字節碼就解釋執行一句.就像以前的解釋器似的.        另一種執行引擎速度更快,但也很耗內存.叫做'即時編譯器'.這種執行引擎會在第一次執行字節碼的時候把字節碼編譯成本地機器代碼然後緩存起來,以後再調用的時候速度就會快很多.        還有一種執行引擎就是自適應優化器.它綜合了前兩種引擎的特點.在這種引擎中,開始的時候是解釋字節碼,但同時會監控字節碼的執行,來記錄執行最頻繁的代碼段.執行引擎把最頻繁的代碼段緩存起來.這樣以來,既不是太耗內存,也加快了程序的速度.        簡單來說,java的classloader機制其實就是指JVM的類加載體系.記住這裏不是指一個classloader,而是一個體系.也就是說 JVM中會有多個classloader.這樣才能給JAVA應用程序以最大的靈活度.java classloader:JAVA 虛擬機JVM啓動-->加載bootstrap classloader-->加載用戶定義的類裝載器.此處bootstrap classloader是JVM實現的一部分,也就說如果JVM是C實現的,那麼bootstrap classloader也會是該C程序的一部分.該classloader通常使用某種默認的方式從本地磁盤裝載類,包括JAVA API類.         每一個類被加載的時候,JVM就會監控這個類,判斷它究竟是被那個classloader裝載進來的.當被裝載進來的類引用了另外的類的時候,JVM就會 使用裝載第一個類的classloader來裝載這個新的類.這樣一來,默認情況下一個類只能看到被同一個classloader加載進來的其他類.正是 通過這樣的體系結構,JAVA才能控制從不同類文件裝載代碼之間的相互影響,也就是可以控制和阻止惡意代碼獲取訪問任意代碼的權限.         (2)安全         JAVA語言的一個重要特點就是內置了一個安全模型.因爲JAVA是一種適應於網絡的技術,所以對安全性的要求比較高.爲了滿足這種需要,JAVA語言的 發明者就在JAVA語言內部內置了一個安全機制.它把用戶的程序限制在一個可配置的沙箱中,以此來保證系統的安全.而要想實現這麼一個沙箱的機制,可不是 那麼簡單.JAVA語言採用了多種方法來共同實現這個機制:         類裝載器結構        CLASS文件檢驗器        JVM本身具有的安全特性        安全管理器和JAVA API        可以說JAVA的類裝載器體系爲JAVA提供了安全的第一道防線.下面簡單介紹一下類裝載器是怎樣爲JAVA提供安全保證的.        類裝載器體系可以從三個方面發揮作用:        1.它防止惡意代碼去幹涉正常代碼        2.它守護了被信任的類庫邊界        3.它將代碼歸入某種區域,該區域確定了代碼可以進行哪些操作.        具體來講,1是通過爲不同的類裝載器裝入的類提供不同的命名空間來實現的.命名空間由一系列唯一的名稱組成,每個被裝載的類有一個名字.命名空間是由 JVM來維護的.這樣一來,我們就可以根據命名空間來控制類的訪問.同一個命名空間的類可以進行交互,而不同命名空間的類不能交互.當然我們可以顯式地提 供允許不同命名空間的類可以進行交互的機制,以滿足特殊的需要.        2是通過分別使用不同的類裝載器裝載可靠的包和不可靠的包來實現的.因爲類裝載器是採用雙親委託方式來加載類的.雙親委託的具體介紹下篇文章講.簡單的說 就是當一個類裝載器要裝載一個類時,它總是先讓它的父裝載器去裝載該類,父類都不行了,才自己試圖裝載該類.所以,每碰到一個類要加載的時候,裝載器體系 總是去找最祖先的那個類裝載器去裝載,而這個祖先裝載器會先去核心的JAVA API中找被裝載類,然後纔去標準擴展類,用戶自定義的類中去尋找.如此這般,類裝載器體系就可以防止不可靠的代碼去惡意替代可靠的類了.        3是類裝載器裝載類後,必須把每個裝載進來的類放置在一個區域內,每個不同的區域定義了這個代碼運行時的權限.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章