標籤:
1. 類載入器簡介
類載入器負責載入所有的類,系統為所有被載入記憶體中的類產生一個java.lang.Class執行個體。一旦一個類被載入JVM中,同一個類就不會被再次載入了。現在的問題是怎麼樣才算“同一個類”?正如一個對象有一個唯一的標識一樣,一個載入JVM的類也有一個唯一的標識。
同理,載入JVM的類也有一個唯一的標識,在java中,一個類用其全限定類名(包括包名和類名)作為標識。但在JVM中,一個類用其全限定類名和其類載入器作為其唯一的標識。因此,如果在pg包中,有一個名為Person的類,被類載入器KlassLoader的執行個體kl負載載入,則該Person類對應的Class對象在jvm中表示為(Person、pg、kl)。這意味著兩個類載入器載入的同名類:(Person、pg、kl)和(Person、pg、kl2)是不同的。它們所載入的類也是完全不同的,互不相容。
當JVM啟動時,會形成由三個類載入器組成的初始類載入器階層:
Bootstrap ClassLoader:根類載入器。
Extension ClassLoader:擴充類載入器。
System ClassLoaser:系統類別載入器。
Bootstrap ClassLoader,被稱為引導(也稱為原始或根)類載入器。它負責載入 Java的核心類。在Sun的JVM中,當執行java.exe的命令時使用-Xbootclasspath選項或使用-D選項指定sun.boot.class.path系統屬性值可以指定載入附加的類。
根類載入器非常特殊,它並不是java.lang.ClassLoader的子類,而是由JVM自身實現的。
Extension ClassLoader,被稱為擴充類載入器,它負責載入JRE的擴充目錄(JAVA_HOME/jre/lib/ext或由java.ext.dirs系統屬性指定的目錄)中的JAR的類包。
System ClassLoaser,被稱為系統(也稱為應用)類載入器,它負責在JVM啟動時,載入來自命令java中的-classpath選項或java.class.path系統屬性,或CLASSPATH環境變數所指定的JAR包和類路徑。
2.類載入機制
JVM的類載入機制主要有如下三種機制:
全盤負責:就是當一個類載入器負載載入某個Class時,該Class鎖依賴的和引用的其它Class也將由該類載入器負載載入,除非顯式使用另外一個類載入器來載入。
父類委託:就是先讓父類載入器試圖載入該Class,只有在父類載入器午法載入該類時才嘗試從自己的類路徑中載入該類。
緩衝機制:緩衝機制將會保證所有被類載入過的Class都會被緩衝,當程式中需要使用某個Class時,類載入器先從緩衝中搜尋該Class,只有緩衝中不存在該Class對象時,系統才會重讀取該類對應的位元據,並將其轉換成Class對象,並存入cache。這就是為什麼修改了Class後,程式必須重新啟動JVM,程式所作的修改才會生效的原因
jvm之類載入器-《瘋狂java講義》