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檔案的原理機制