1. 程式人生 > 其它 >jvm 類的載入機制與原理

jvm 類的載入機制與原理

  jvm(java virtual machine)可以被拆分為好幾個部分,最開始的類載入器,執行引擎,本地介面、執行時資料區域。本章節主要針對類的載入機制進行說明

  目前基本都知道,類在被執行時,需要經過堆類的載入,連結(驗證、準備、解析)和初始化的階段以及後面的回收階段。

  那麼類是怎麼被載入的呢?

  類載入器的作用是將所需的類載入到記憶體中供應用程式使用。而載入器載入類是有原則遵循的。其遵守三個原則,委託機制、可見性、單一性

    委託機制:載入類在載入class檔案時,會優先交由父類去載入,如果父類找不到或者無法載入這個類,就會由其本身去載入

    可見性:子載入類可以向上去找父載入類載入的類,而父載入類無法找到子載入類載入的類。

    單一性:在一個應用中一個類只能被載入一次。

  

  jvm的載入類分為四種:

    根載入器(BootStrap classLoader):主要載入jre中的rt.jar中的class檔案

  擴充套件類載入器(Ext classLoader):主要用於載入jre中ext.jar中的class檔案

    系統類載入器(System classLoader):主要用於載入classpath下的class檔案,開發的功能類

    自定義類載入器(Custom classLoader): 有開發者有特殊需求,可自定義開發載入類,去載入特定的類

  

  類的載入方式

    隱式載入:一般在寫程式碼用new 或者呼叫靜態欄位方法時,就是隱式載入了

    顯示載入:通過呼叫Class.forName()或者ClassLoader.loadClass()等方法  

  類載入器之間的關係與載入過程:

    每個類載入器都有一個父類載入器(根載入器除外),關係為:自定義->系統->擴充套件類(父類載入器為null表示父類載入器為根載入器)->根。

    這裡的父類不是繼承關係,而是引用關係,每個子載入類都有指向父類的一個引用。

    類在系統的中由類載入器+類的全限定名稱組成唯一的標識,不同載入器載入同一個類,是不相等的,

    

    載入過程:首先某個類在載入時,會先讓一個載入器去檢查是否被當前載入器載入(loadClass()方法),如果已被載入則返回;未被載入,如果有父載入類,則讓父載入器載入,如果沒有父載入器,則讓根加     載器載入。如果都沒有找到,則讓自身去載入(findClass()方法)。這就是上面的委託機制(雙親委派機制)。

    

    參考連結:(20條訊息) java 類載入器 雙親委派 根載入器、擴充套件類載入器、系統類載入器_wangjun5159的專欄-CSDN部落格

         (20條訊息) 【JVM】JVM載入class檔案的原理機制_renjingjingya0429的部落格-CSDN部落格_jvm載入class檔案的原理機制