摘要:前面提到,對于數(shù)組類來說,它并沒有對應的字節(jié)流,而是由虛擬機直接生成的。對于其他的類來說,虛擬機則需要借助類加載器來完成查找字節(jié)流的過程。驗證階段的目的,在于確保被加載類能夠滿足虛擬機的約束條件。
Java 虛擬機將字節(jié)流轉化為 Java 類的過程。這個過程可分為加載、鏈接以及初始化
三大步驟。
加載是指查找字節(jié)流,并且據(jù)此創(chuàng)建類的過程。加載需要借助類加載器,在 Java 虛擬機中,類加載
器使用了雙親委派模型,即接收到加載請求時,會先將請求轉發(fā)給父類加載器。
鏈接,是指將創(chuàng)建成的類合并至 Java 虛擬機中,使之能夠執(zhí)行的過程。鏈接還分驗證、準備和解析
三個階段。其中,解析階段為非必須的。
初始化,則是為標記為常量值的字段賦值,以及執(zhí)行 < clinit > 方法的過程。類的初始化僅會被執(zhí)
行一次,這個特性被用來實現(xiàn)單例的延遲初始化。
加載,是指查找字節(jié)流,并且據(jù)此創(chuàng)建類的過程。前面提到,對于數(shù)組類來說,它并沒有對應的字
節(jié)流,而是由 Java 虛擬機直接生成的。對于其他的類來說,Java 虛擬機則需要借助類加載器來完
成查找字節(jié)流的過程。
由類加載器classLoadder負責類裝載,JDK 默認提供了如下幾種ClassLoader
Bootstrp loader
Bootstrp加載器是用C++語言寫的,它是在Java虛擬機啟動后初始化的,它主要負責加載%JAVA_HOME%/jre/lib,-Xbootclasspath參數(shù)指定的路徑以及%JAVA_HOME%/jre/classes中的類。
ExtClassLoader
Bootstrp loader加載ExtClassLoader,并且將ExtClassLoader的父加載器設置為Bootstrp loader.ExtClassLoader是用Java寫的,具體來說就是 sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加載%JAVA_HOME%/jre/lib/ext,此路徑下的所有classes目錄以及java.ext.dirs系統(tǒng)變量指定的路徑中類庫。
AppClassLoader
Bootstrp loader加載完ExtClassLoader后,就會加載AppClassLoader,并且將AppClassLoader的父加載器指定為 ExtClassLoader。AppClassLoader也是用Java寫成的,它的實現(xiàn)類是 sun.misc.Launcher$AppClassLoader,另外我們知道ClassLoader中有個getSystemClassLoader方法,此方法返回的正是AppclassLoader.AppClassLoader主要負責加載classpath所指定的位置的類或者是jar文檔,它也是Java程序默認的類加載器。
java采用了委托模型機制,這個機制簡單來講,就是“類裝載器有載入類的需求時,會先請示其Parent使用其搜索路徑幫忙載入,如果Parent 找不到,那么才由自己依照自己的搜索路徑搜索類”,或者叫雙親委派模型。
鏈接,是指將創(chuàng)建成的類合并至 Java 虛擬機中,使之能夠執(zhí)行的過程。它可分為驗證、準備以及解
析三個階段。
驗證階段的目的,在于確保被加載類能夠滿足 Java 虛擬機的約束條件。
準備階段的目的,則是為被加載類的靜態(tài)字段分配內存。Java 代碼中對靜態(tài)字段的具體初始化,則
會在稍后的初始化階段中進行。
在 class 文件被加載至 Java 虛擬機之前,這個類無法知道其他類及其方法、字段所對應的具體地
址,甚至不知道自己方法、字段的地址。因此,每當需要引用這些成員時,Java 編譯器會生成一個
符號引用。在運行階段,這個符號引用一般都能夠無歧義地定位到具體目標上。
在 Java 代碼中,如果要初始化一個靜態(tài)字段,我們可以在聲明時直接賦值,也可以在靜態(tài)代碼塊中
對其賦值。
類的初始化何時會被觸發(fā)呢?JVM 規(guī)范枚舉了下述多種觸發(fā)情況:
當虛擬機啟動時,初始化用戶指定的主類;
當遇到用以新建目標類實例的 new 指令時,初始化 new 指令的目標類;
當遇到調用靜態(tài)方法的指令時,初始化該靜態(tài)方法所在的類;
當遇到訪問靜態(tài)字段的指令時,初始化該靜態(tài)字段所在的類;
子類的初始化會觸發(fā)父類的初始化;
如果一個接口定義了 default 方法,那么直接實現(xiàn)或者間接實現(xiàn)該接口的類的初始化,會觸發(fā)
該接口的初始化;
使用反射 API 對某個類進行反射調用時,初始化這個類;
當初次調用 MethodHandle 實例時,初始化該 MethodHandle 指向的方法所在的類。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73079.html
摘要:學習能更深入的理解這門語言,能理解語言底層的執(zhí)行過程,深入到字節(jié)碼層次。 目錄 ? 前言 程序的運行 1.JVM類加載機制 ①一般在什么情況下會去加載一個類?也就是說,什么時候.class字節(jié)碼文件中加載這個類到JVM內存里來? ②驗證、準備、初始化 ③初始化 2.類加載器和雙親委派機制 ...
摘要:如果需要支持類的動態(tài)加載或需要對編譯后的字節(jié)碼文件進行解密操作等,就需要與類加載器打交道了。雙親委派模型,雙親委派模型,約定類加載器的加載機制。任何之類的字節(jié)碼都無法調用方法,因為該方法只能在類加載的過程中由調用。 jvm系列 垃圾回收基礎 JVM的編譯策略 GC的三大基礎算法 GC的三大高級算法 GC策略的評價指標 JVM信息查看 GC通用日志解讀 jvm的card table數(shù)據(jù)...
摘要:類加載器三杰有三類,分別是以及。線程上下文類加載器線程上下文類加載器可以不遵循雙親委派機制。免費領取驗證碼內容安全短信發(fā)送直播點播體驗包及云服務器等套餐更多網易技術產品運營經驗分享請訪問網易云社區(qū)。文章來源網易云社區(qū) 本文由作者張遠道授權網易云社區(qū)發(fā)布。 類加載器三杰 jvm有三類classloader,分別是bootstrap classloader,extended classlo...
摘要:加載器種類啟動類加載器在中用來加載自身需要的類,實現(xiàn),用來加載。那么就能保證的類會被優(yōu)先加載,限制了使用者對系統(tǒng)的影響。這種方式下就完成類加載器的雙親委派機制此處會將作為參數(shù)傳入進去實際上是調用了方法 Class 文件的裝載流程 (類加載過程) 加載 -> 連接 (驗證 -> 準備 -> 解析) -> 初始化 -> 使用 -> 卸載 加載 加載階段,jvm 會通過類名獲取到此類的字節(jié)碼...
摘要:執(zhí)行引擎作用執(zhí)行字節(jié)碼,或者執(zhí)行本地方法運行時數(shù)據(jù)區(qū)其實就是指在運行期間,其對內存空間的劃分和分配。 雖是讀書筆記,但是如轉載請注明出處https://uestc-dpz.github.io..拒絕伸手復制黨 JVM Java 虛擬機 Java 虛擬機(Java virtual machine,JVM)是運行 Java 程序必不可少的機制。JVM實現(xiàn)了Java語言最重要的特征:即平臺...
摘要:新生代又被劃分為三個區(qū)域和兩個幸存區(qū)。這樣劃分的目的是為了使能夠更好地管理堆內存中的對象,包括內存的分配及回收。新生代主要存儲新創(chuàng)建的對象和尚未進入老年代的對象。 在Java中主要有以下三種類加載器: 引導類加載器(bootstrap class loader) --用來加載java的核心庫(Strin...
閱讀 3758·2023-04-25 20:00
閱讀 3109·2021-09-22 15:09
閱讀 505·2021-08-25 09:40
閱讀 3412·2021-07-26 23:38
閱讀 2201·2019-08-30 15:53
閱讀 1097·2019-08-30 13:46
閱讀 2788·2019-08-29 16:44
閱讀 2043·2019-08-29 15:32