JVM ClassLoader機制 【轉載的】

1)三個類加載器:bootstrap

bootstrap classloader - 引導(也稱爲原始)類加載器,它負責加載Java的核心類。jvm

extension classloader - 擴展類加載器,它負責加載JRE的擴展目錄中JAR的類包。url

system classloader - 系統(也稱爲應用)類加載器,加載應用程序的類。spa

bootstrap classloader不是一個真正的ClassLoader實例orm

2)獲取引導類加載器加載了哪些類:繼承

URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();
     for (int i = 0; i < urls.length; i++) {
         System.out.println(urls.toExternalForm());
     }
ssl

3)獲取應用類加載器:get

ClassLoader.getSystemClassLoader()it

4)JVM類加載機制:全盤負責委託機制io

全盤負責:當一個classloader加載一個Class的時候,這個Class所依賴的和引用的全部Class也由這個classloader負責載入,除非是顯式的使用另一個classloader載入;
委託機制:先讓parent(父)類加載器(而不是super,它與parent classloader類不是繼承關係)尋找,只有在parent找不到的時候才從本身的類路徑中去尋找。

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

5)每一個ClassLoader加載Class的過程是:
1.
檢測此Class是否載入過(即在cache中是否有此Class),若是有到8,若是沒有到22.若是parent classloader不存在(沒有parent,那parent必定是bootstrap classloader了),到43.請求parent classloader載入,若是成功到8,不成功到54.請求jvm從bootstrap classloader中載入,若是成功到85.尋找Class文件(從與此classloader相關的類路徑中尋找)。若是找不到則到7.6.從文件中載入Class,到8.7.拋出ClassNotFoundException.8.返回Class.其中5.6步咱們能夠經過覆蓋ClassLoader的findClass方法來實現本身的載入策略。甚至覆蓋loadClass方法來實現本身的載入過程。

相關文章
相關標籤/搜索