JVM - classLoader

此文參考:  http://www.cnblogs.com/liu-5525/p/5614425.htmlhtml

1. classLoader 如何加載 classjava

ClassLoader 負責將 .class 文件(可能在disk上,可能在網絡上) 加載到 RAM 裏面, 併爲之生成對應的 [java.lang.Class] object. 當 JVM 啓動的時候bootstrap

會造成由三個 ClassLoader 組成的 初始類加載器 層次結構: bootstrap classloader --> extension classloader --> system classloader網絡

 

bootstrap classloader: 引導(也稱爲原始) classloader. 它負責加載 java的核心類.   這個classloader is very special, it is not extended from java.lang.ClassLoader, 而是由JVM自身實現的。 能夠經過執行如下代碼來得到 bootstrap classloader 加載了哪些 core classes.jvm

````` url

URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();spa

for(int i=0;i<urls.length;i++){操作系統

  System.out.println(urls[i].toExternalForm());orm

}htm

sample output 

file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.72-9.b16.fc23.x86_64/jre/lib/resources.jar                                                           
file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.72-9.b16.fc23.x86_64/jre/lib/rt.jar                                                                  
file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.72-9.b16.fc23.x86_64/jre/lib/sunrsasign.jar                                                          
file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.72-9.b16.fc23.x86_64/jre/lib/jsse.jar                                                                
file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.72-9.b16.fc23.x86_64/jre/lib/jce.jar                                                                 
file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.72-9.b16.fc23.x86_64/jre/lib/charsets.jar                                                            
file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.72-9.b16.fc23.x86_64/jre/lib/jfr.jar                                                                 
file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.72-9.b16.fc23.x86_64/jre/classes

`````

 

應爲 JVM 在啓動的時候自動加載它們,因此不須要再 系統屬性CLASSPATH 中指定這些 class

 

 

 

extension classLoader: 擴展類加載器, 它負責加載 JRE 的擴展目錄 (JAVA_HOME/jre/lib/ext 或者由 java.ext.dirs 系統屬性指定的)

中的 jar 包. 這爲引入除了 core class 之外的新功能提供了一個標準機制. 由於默認的擴展目錄對全部從 同一個 JRE 中 啓動 的 JVM  都是通用的

因此放入這個目錄的 jar 包對全部的 JVM 和 system classloader 都是可見的. extension classLoader 是 system classloader 的parent, 而 

bootstrap classloader 是 extension classloader 的 parent, 可是 bootstrap classloader 不是 一個實際的 classloader.

 

 

system classloader: 系統(應用)類加載器, 它負責在JVM被啓動時,加載來自命令 java -classpath 或者 java.class.path 系統屬性或者 

CLASSPATH 操做系統屬性 所指定的 jar 類包和類路徑.

能夠經過靜態方法 ClassLoader.getSystemClassLoader() 找到該類加載器。若是沒有特別指出,用戶自定義的任何classloader都繼承該加載器

 

 

classloader 加載類用的是全盤負責委託機制

全盤負責:當一個classloader加載一個class的時候,這個class所依賴的和引用的全部class 也有這個classloader 負責載入,除非是explicitly use another classloader to load the depended classes.

 

委託機制: 先讓parent classloader 尋找,只有在parent找不到的時候才從本身的classpath中尋找.

 

cache 機制: classloader 採用了cache機制, 若是cache 中保存了這個class就直接返回它,若是沒有才從文件中讀取和轉換成class,並存入 cache, 這就是爲何修改了class就必須重新啓動JVM 才能生效的緣由

相關文章
相關標籤/搜索