91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是類加載機制

發布時間:2021-06-23 10:59:08 來源:億速云 閱讀:126 作者:chen 欄目:大數據

本篇內容主要講解“什么是類加載機制”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“什么是類加載機制”吧!

類記載過程

多個java文件經過編譯打包生成可運行的jar包,最終由java命令運行某個主類的main函數啟動程序,這里首先需要通過類加載器把主類加載到jvm。 主類在運行過程中如果使用到其他類,會逐步加載這些類。 注意,jar包里的類不是一次性全部加載的,是使用時才加載的。

從類加載到使用整個過程由如下幾步: 加載、驗證、準備、解析、初始化、使用、卸載

  • 加載:在硬盤上查找并通過IO讀入字節碼文件,使用到類時才會加載,例如:調用類的main方法,new對象等;

  • 驗證:校驗字節碼文件的正確性;

  • 準備:給類的靜態變量分配內存,并賦予默認值;

  • 解析:將符號引用替換為直接引用,該階段會把一些靜態方法(符號引用,比如main方法)替換為指向數據所在內存的指針或句柄等(直接引用),這就是靜態鏈接過程,這個過程是在類記載期間完成的。動態鏈接是程序運行期間完成的將符號引用替換為直接引用。

  • 初始化:對類的靜態變量初始化為指定的值,執行靜態代碼塊。 什么是類加載機制

類加載器

上面的類加載過程主要是通過類加載器來實現的,java里有以下幾種類加載器。

  • 啟動類加載器:負責加載支撐JVM運行的位于JREd額lib目錄下的核心類庫;

  • 擴展類加載器:負責加載支撐JVM運行位于JRE的lib目錄下的ext擴展目錄中的JAR類包;

  • 應用程序加載器:負責加載ClassPath路徑下的類包,主要就是加載應用程序的類;

  • 自定義加載器:負責加載用戶自定義路徑下的類包;

類記載器繼承了java.lang.ClassLoader類,該類有兩個核心方法,loadClass和findClass。

protected Class<?> loadClass(String name, boolean resolve)
    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;
    }
}

findClass方法默認實現是拋出異常,所以我們在自定義類加載器主要是重寫findClass方法。

protected Class<?> findClass(String name) throws ClassNotFoundException {
    throw new ClassNotFoundException(name);
}

雙親委派機制

jvm類加載器是有親子層結構的.

什么是類加載機制

這里類加載就是雙親委派機制,記載某個類時, 會先委托父加載器尋找目標類,找不到再委托上層父加載器加載,如果所有父加載器再自己的加載類路徑下都找不到目標類,則再自己的類加載路徑中查找并載入目標類。

比如:Math類,最先會找應用程序類加載器加載,應用程序加載器會先委托擴展類加載器加載,擴展類加載器再委托啟動類加載器,頂層啟動類加載器在自己的類加載器路徑里找了半天沒找到Math類,則向下退回加載Math類的請求,擴展類加載器收到回復就自己加載,在自己的類加載路徑里找了半天也沒找到Math類,又向下退回Math類的加載請求給應用程序類加載器,應用程序類加載器于是在自己的類加載路徑中找到了Math類,于是就自己加載了。

雙親委派機制說簡單就是:先找父親加載,不行再由父親自己加載。

到此,相信大家對“什么是類加載機制”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辽宁省| 吕梁市| 克山县| 石泉县| 化德县| 闻喜县| 阿合奇县| 家居| 阿瓦提县| 西乡县| 霍山县| 昌宁县| 勐海县| 中阳县| 琼结县| 淮北市| 阿坝县| 盱眙县| 台州市| 武鸣县| 如东县| 通城县| 类乌齐县| 淄博市| 镇巴县| 邮箱| 乌恰县| 六枝特区| 祁东县| 佛坪县| 九寨沟县| 札达县| 汤阴县| 连城县| 阿拉善盟| 西藏| 康乐县| 桐梓县| 抚远县| 崇州市| 龙口市|