12、java知識點——類加載機制(硬貨)

一、類加載過程有5步,如圖:
java

1)、加載:分爲預加載、運行時加載;
   預加載:虛擬機啓動時加載,加載的是JAVA_HOME/lib/下的rt.jar下的.class文件;
   運行時加載:將用到的類的class對象加載到內存中;
2)、驗證:確保Class文件的字節流中包含信息符合當前虛擬機要求,不會危害虛擬機自身安全。 主要包括四種驗證,文件格式驗證,元數據驗證,字節碼驗證,符號引用驗證;

3)、準備:爲類變量(即static修飾的字段變量)分配內存而且設置該類變量的初始值爲0
4)、解析:虛擬機將常量池內的符號引用替換爲直接引用的過程;
   符號引用(編譯以後的UTF-8就是符號引用):一組符號來描述目標,能夠是任何字面量;
   直接引用:直接指向目標的指針、相對偏移量或一個間接定位到目標的句柄。有類或接口的解析,字段解析,類方法解析,接口方法解析
5)、初始化:給static變量賦值以及執行靜態代碼塊。
api

二、類加載器 安全

1)、引導(Bootstrap)類加載器(C++語言實現):
   主要加載的是JVM自身須要的類,負責將 <JAVA_HOME>/lib路徑下的核心類庫或-Xbootclasspath參數指定的路徑下的jar包加載到內存中 只加載包名爲java、javax、sun等開頭的類;
2)、擴展(Extension)類加載器(Java語言實現、ExtClassLoader類):
  用來加載 Java 的擴展庫(jre/ext/*.jar); 3)、系統(System)類加載器(也稱應用類加載器、AppClassLoader):
  負責加載系統類路徑java -classpath或-D java.class.path 指定路徑下的類庫, 是程序中默認的類加載器, 經過ClassLoader#getSystemClassLoader()方法能夠獲取到該類加載器;
4)、自定義類加載器(custom class loader):
  經過繼承 java.lang.ClassLoader類的方式實現本身的類加載器,以知足一些特殊的需求。

三、雙親委派機制:
  工做原理若是一個類加載器收到了類加載請求, 它並不會本身先去加載,而是把這個請求委託給父類的加載器去執行, 若是父類加載器還存在其父類加載器,則進一步向上委託,依次遞歸, 請求最終將到達頂層的啓動類加載器,若是父類加載器能夠完成類加載任務,就成功返回, 假若父類加載器沒法完成此加載任務,子加載器纔會嘗試本身去加載,這就是雙親委派模式。

優缺點:
   好處:
  1)、Java類隨着它的類加載器一塊兒具有了一種帶有優先級的層次關係, 經過這種層級關能夠避免類的重複加載,當父親已經加載了該類時,就沒有必要子ClassLoader再加載一次;
  2)、保證java核心庫的安全性,java核心api中定義類型不會被隨意替換。


spa

以爲不錯,歡迎給一個贊!謝謝!指針

相關文章
相關標籤/搜索