java學習筆記之類加載器

雖然學習java也有一年多了,對java的運用可以算作熟練,但深入到java的執行過程,就一年茫然了,所以買了一本《JVM高級虛擬機》。結合網上找的關於類加載機制,談談自己的收穫吧。

JVM三種預定義類型類加載器
我們首先看一下 JVM預定義的三種類型類加載器,當一個 JVM 啓動的時候, Java 缺省開始使用如下三種類型類裝入器:

啓動( Bootstrap )類加載器 :引導類裝入器是用本地代碼實現的類裝入器,它負責將 /lib 下面的類庫加載到內存中。由於引導類加載器涉及到虛擬機本地實現細節,開發者無法直接獲取到啓動類加載器的引用,所以不允許直接通過引用進行操作。

標準擴展( Extension )類加載器 :擴展類加載器是由 Sun 的 ExtClassLoader( sun.misc.Launcher$ExtClassLoader) 實現的。它負責將 < Java_Runtime_Home >/lib/ext (JRE中)或者由系統變量 java.ext.dir 指定位置中的類庫加載到內存中。開發者可以直接使用標準擴展類加載器。

系統( System )類加載器 :系統類加載器是由 Sun 的 AppClassLoader( sun.misc.Launcher$AppClassLoader)實現的。它負責將系統類路徑( CLASSPATH)中指定的類庫加載到內存中。開發者可以直接使用系統類加載器。

除了以上列舉的三種類加載器,還有一種比較特殊的類型就是線程上下文類加載器

ClassLoader 的常用方法
這裏寫圖片描述

JVM在加載類時默認採用的是雙親委派 機制。通俗的講,就是某個特定的類加載器在接到加載類的請求時,首先將加載任務委託給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務,就成功返回;只有父類加載器無法完成此加載任務時,才自己去加載 。

LoadClass 中 loadClass()源碼解析

public Class<?> loadClass(String name)throws ClassNotFoundException {

        return loadClass(name, false);

}

protected synchronized Class<?> loadClass(String name, boolean resolve)

            throws ClassNotFoundException {

        // 首先判斷該類型是否已經被加載

        Class c = findLoadedClass(name);

        if (c == null) {

            //如果沒有被加載,就委託給父類加載或者委派給啓動類加載器加載

            try {

                if (parent != null) {

//如果存在父類加載器,就委派給父類加載器加載

                    c = parent.loadClass(name, false);

                } else {

//如果不存在父類加載器,就檢查是否是由啓動類加載器加載的類,通過調用本地方法native Class findBootstrapClass(String name)

                    c = findBootstrapClass0(name);

                }

            } catch (ClassNotFoundException e) {
        // 如果父類加載器和啓動類加載器都不能完成加載任務,才調用自身的加載功能
                c = findClass(name);
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;

    } 

有關ClassLoader還有很重要一點:
同一個ClassLoader加載的類文件,只有一個Class實例。但是,如果同一個類文件被不同的ClassLoader載入,則會有兩份不同的ClassLoader實例(前提是着兩個類加載器不能用相同的父類加載器)。

類加載的一般過程

一、簡單過程

Java程序運行的場所是內存,當在命令行下執行:
java HelloWorld
命令的時候,JVM會將HelloWorld.class加載到內存中,並形成一個Class的對象HelloWorld.class。
其中的過程就是類加載過程:
1、尋找jre目錄,尋找jvm.dll,並初始化JVM;
2、產生一個Bootstrap Loader(啓動類加載器);
3、Bootstrap Loader自動加載Extended Loader(標準擴展類加載器),並將其父Loader設爲Bootstrap Loader。
4、Bootstrap Loader自動加載AppClass Loader(系統類加載器),並將其父Loader設爲Extended Loader。
5、最後由AppClass Loader加載HelloWorld類。

以上就是類加載的最一般的過程。

發佈了18 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章