JAVA之瞭解類載入器Classloader

1、類的載入、鏈接和初始化  css

類初始化一般包含載入、鏈接、初始化三個步驟。html

 

1)進程的結束java

每當執行一個java程序時,將會啓動一個java虛擬機進程,不管程序多麼複雜。有多少線程。都在這個java虛擬機進程裏。下面四種狀況會使得該進程被終止——bootstrap

  • 程序執行到最後正常結束;
  • 程序裏遭遇了System.exit(),或者是Runtime.getRunTime().exit()代碼。
  • 程序執行中遇到了未捕獲的異常或者錯誤;
  • java所在平臺強制結束了JVM進程;

 

當該進程結束,那麼該進程在內存中的狀態將會丟失。包含靜態變量的值。緩存

2)類的載入jvm

類的載入是指將類的class文件讀入內存。併爲之建立一個java.lang.class對象。post

 

3)類的鏈接spa

類的鏈接負責把類的二進制數據合併到JRE中,分爲三個階段——線程

  • 驗證:檢驗被載入的類是否有正確的內部結構;
  • 準備:負責爲類的靜態Field分配內存,並設置默認初始值。
  • 解析:將類的二進制數據中的符號應用替換成直接引用。

 

4)類的初始化xml

類的初始化。主要就是對靜態Field進行初始化。

 

2、類載入器

 

1)類載入器簡單介紹

類載入器負責載入所有的類。系統爲所有載入內存裏的類都會生成一個java.lang.class對象。

同一個類僅僅會被載入一次,在JVM中每一個不一樣的類都會有一個不一樣的類載入器負責。

類載入器在不包含用戶本身定義的載入器的狀況下包含三層:

 

  • Bootstrap Classloader根載入器;
  • ExtensionClassloader擴展類載入器。
  • System ClassLoader系統類載入器。

 

根載入器,又稱爲引導或者原始載入器,負責載入java的核心類;

擴展類載入器,負責載入JRE的擴展文件夾中JAR包的類。

系統類載入器。又稱爲應用載入器。負責JVM啓動時載入來自java命令的-classpath或者CLASSPATH環境變量所指定的JAR包和類路徑。一般是程序執行的當前路徑。因此其稱爲應用類載入器。

三個類載入器的順序是:

      bootstrap classloader

               |

      extension classloader

               |

      system classloader

假設實用戶本身定義的類載入器,那麼在系統載入器後。將會執行用戶類載入器。

 

2)本身定義類載入器

假設咱們需要在啓動類載入時做一些特定需求的行爲,那麼就需要本身定義類載入器了。

本身定義ClassLoader需要繼承ClassLoader抽象類,重寫findClass方法,這種方法定義了ClassLoader查找class的方式。

主要可以擴展的方法有:

findClass         定義查找Class的方式

defineClass      將類文件字節碼載入爲jvm中的class

findResource   定義查找資源的方式

 

3)類載入機制

JVM的類載入機制有下面三種:

  • 全盤負責:

所謂全盤負責。便是當一個classloader載入一個Class的時候,這個Class所依賴的和引用的所有 Class也由這個classloader負責載入,除非是顯式的使用另一個classloader載入。

 

  • 父類託付:

所謂父類託付。就是先讓父類載入器先嚐試載入該Class,當父類沒法載入的時候。纔是嘗試從本身的類路徑中去載入。

JVMClassLoader採用的是樹形結構,除了BootstrapClassLoader之外。每一個ClassLoader都會有一個parentClassLoader,即父類載入器,用戶本身定義的ClassLoader默認的parendClassLoaderSystemClassLoader,固然你可以本身指定需要用哪個ClassLoader的實例

 

  • 緩存機制:

所謂緩存機制就是保證所有載入過的類都會被緩存。當程序中需要某個類時,會先從緩存區中搜查該類,當緩存區不存在該類對象時,系統纔會讀取該類的二進制文件。

相關文章
相關標籤/搜索