JVM學習筆記——雙親委派方式

簡介

本篇包括如下內容:java

  • 什麼是雙親委派機制。
  • 雙親委派機制的處理流程。

什麼是雙親委派機制。

運行原理
  • 一個類加載器收到類加載請求,不會本身馬上嘗試加載類,而是把請求委託給父加載器去完成,每一層都是如此,全部的加載請求最終都傳遞到最頂層的引導類加載器進行處理。
  • 若是父加載器不存在了,那麼嘗試判斷該類能不能被引導類加載器加載。
  • 若是父加載器沒法加載,子加載器纔會嘗試本身加載。
爲何要有如此複雜的雙親委派機制
  • 防止類的重複加載。
  • 保護程序安全,防止核心API被篡改。例:咱們本身編寫一個java.lang.Object用本身的類加載器進行加載,系統中就會存在多個Object類。

雙親委派機制的處理流程。

如下是java.lang.Classload.loadClass()方法的實現。``安全

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

throws ClassNotFoundException
{
    synchronized (getClassLoadingLock(name)) {
        // First, check if the class has already been loaded
        Class<?> c = findLoadedClass(name);
        if (c == null) {
            long t0 = System.nanoTime();
            try {
                if (parent != null) {
                    c = parent.loadClass(name, false);
                } else {
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                // ClassNotFoundException thrown if class not found
                // from the non-null parent class loader
            }

            if (c == null) {
                // If still not found, then invoke findClass in order
                // to find the class.
                long t1 = System.nanoTime();
                c = findClass(name);

                // this is the defining class loader; record the stats
                sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                sun.misc.PerfCounter.getFindClasses().increment();
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
}

``
轉換成流程圖:
LoadClass.pngspa

雙親委託機制特色。

  1. 可見性原則code

    1. 應用類加載器是能夠讀取到由擴展類加載器和引導類加載器加載進來的Class的。
    2. 擴展類加載器能夠讀取到由引導類加載器加載的Class。
  2. 惟一性類是惟一的,類不會被重複加載。
相關文章
相關標籤/搜索