成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

jvm類加載機(jī)制

lastSeries / 1529人閱讀

摘要:前面提到,對(duì)于數(shù)組類來(lái)說(shuō),它并沒有對(duì)應(yīng)的字節(jié)流,而是由虛擬機(jī)直接生成的。對(duì)于其他的類來(lái)說(shuō),虛擬機(jī)則需要借助類加載器來(lái)完成查找字節(jié)流的過程。驗(yàn)證階段的目的,在于確保被加載類能夠滿足虛擬機(jī)的約束條件。

Java 虛擬機(jī)將字節(jié)流轉(zhuǎn)化為 Java 類的過程。這個(gè)過程可分為加載、鏈接以及初始化

三大步驟。

加載是指查找字節(jié)流,并且據(jù)此創(chuàng)建類的過程。加載需要借助類加載器,在 Java 虛擬機(jī)中,類加載

器使用了雙親委派模型,即接收到加載請(qǐng)求時(shí),會(huì)先將請(qǐng)求轉(zhuǎn)發(fā)給父類加載器。

鏈接,是指將創(chuàng)建成的類合并至 Java 虛擬機(jī)中,使之能夠執(zhí)行的過程。鏈接還分驗(yàn)證、準(zhǔn)備和解析

三個(gè)階段。其中,解析階段為非必須的。

初始化,則是為標(biāo)記為常量值的字段賦值,以及執(zhí)行 < clinit > 方法的過程。類的初始化僅會(huì)被執(zhí)

行一次,這個(gè)特性被用來(lái)實(shí)現(xiàn)單例的延遲初始化。

加載

加載,是指查找字節(jié)流,并且據(jù)此創(chuàng)建類的過程。前面提到,對(duì)于數(shù)組類來(lái)說(shuō),它并沒有對(duì)應(yīng)的字
節(jié)流,而是由 Java 虛擬機(jī)直接生成的。對(duì)于其他的類來(lái)說(shuō),Java 虛擬機(jī)則需要借助類加載器來(lái)完
成查找字節(jié)流的過程。

由類加載器classLoadder負(fù)責(zé)類裝載,JDK 默認(rèn)提供了如下幾種ClassLoader

Bootstrp loader

Bootstrp加載器是用C++語(yǔ)言寫的,它是在Java虛擬機(jī)啟動(dòng)后初始化的,它主要負(fù)責(zé)加載%JAVA_HOME%/jre/lib,-Xbootclasspath參數(shù)指定的路徑以及%JAVA_HOME%/jre/classes中的類。

ExtClassLoader

Bootstrp loader加載ExtClassLoader,并且將ExtClassLoader的父加載器設(shè)置為Bootstrp loader.ExtClassLoader是用Java寫的,具體來(lái)說(shuō)就是 sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加載%JAVA_HOME%/jre/lib/ext,此路徑下的所有classes目錄以及java.ext.dirs系統(tǒng)變量指定的路徑中類庫(kù)。

AppClassLoader

Bootstrp loader加載完ExtClassLoader后,就會(huì)加載AppClassLoader,并且將AppClassLoader的父加載器指定為 ExtClassLoader。AppClassLoader也是用Java寫成的,它的實(shí)現(xiàn)類是 sun.misc.Launcher$AppClassLoader,另外我們知道ClassLoader中有個(gè)getSystemClassLoader方法,此方法返回的正是AppclassLoader.AppClassLoader主要負(fù)責(zé)加載classpath所指定的位置的類或者是jar文檔,它也是Java程序默認(rèn)的類加載器。

java采用了委托模型機(jī)制,這個(gè)機(jī)制簡(jiǎn)單來(lái)講,就是“類裝載器有載入類的需求時(shí),會(huì)先請(qǐng)示其Parent使用其搜索路徑幫忙載入,如果Parent 找不到,那么才由自己依照自己的搜索路徑搜索類”,或者叫雙親委派模型。

鏈接

鏈接,是指將創(chuàng)建成的類合并至 Java 虛擬機(jī)中,使之能夠執(zhí)行的過程。它可分為驗(yàn)證、準(zhǔn)備以及解
析三個(gè)階段。

驗(yàn)證階段的目的,在于確保被加載類能夠滿足 Java 虛擬機(jī)的約束條件。

準(zhǔn)備階段的目的,則是為被加載類的靜態(tài)字段分配內(nèi)存。Java 代碼中對(duì)靜態(tài)字段的具體初始化,則

會(huì)在稍后的初始化階段中進(jìn)行。

在 class 文件被加載至 Java 虛擬機(jī)之前,這個(gè)類無(wú)法知道其他類及其方法、字段所對(duì)應(yīng)的具體地
址,甚至不知道自己方法、字段的地址。因此,每當(dāng)需要引用這些成員時(shí),Java 編譯器會(huì)生成一個(gè)
符號(hào)引用。在運(yùn)行階段,這個(gè)符號(hào)引用一般都能夠無(wú)歧義地定位到具體目標(biāo)上。

初始化

在 Java 代碼中,如果要初始化一個(gè)靜態(tài)字段,我們可以在聲明時(shí)直接賦值,也可以在靜態(tài)代碼塊中
對(duì)其賦值。

類的初始化何時(shí)會(huì)被觸發(fā)呢?JVM 規(guī)范枚舉了下述多種觸發(fā)情況:

當(dāng)虛擬機(jī)啟動(dòng)時(shí),初始化用戶指定的主類;

當(dāng)遇到用以新建目標(biāo)類實(shí)例的 new 指令時(shí),初始化 new 指令的目標(biāo)類;

當(dāng)遇到調(diào)用靜態(tài)方法的指令時(shí),初始化該靜態(tài)方法所在的類;

當(dāng)遇到訪問靜態(tài)字段的指令時(shí),初始化該靜態(tài)字段所在的類;

子類的初始化會(huì)觸發(fā)父類的初始化;

如果一個(gè)接口定義了 default 方法,那么直接實(shí)現(xiàn)或者間接實(shí)現(xiàn)該接口的類的初始化,會(huì)觸發(fā)

該接口的初始化;

使用反射 API 對(duì)某個(gè)類進(jìn)行反射調(diào)用時(shí),初始化這個(gè)類;

當(dāng)初次調(diào)用 MethodHandle 實(shí)例時(shí),初始化該 MethodHandle 指向的方法所在的類。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73079.html

相關(guān)文章

  • 從一無(wú)所知到無(wú)所不知————jvm系列(1)

    摘要:學(xué)習(xí)能更深入的理解這門語(yǔ)言,能理解語(yǔ)言底層的執(zhí)行過程,深入到字節(jié)碼層次。 目錄 ? 前言 程序的運(yùn)行 1.JVM類加載機(jī)制 ①一般在什么情況下會(huì)去加載一個(gè)類?也就是說(shuō),什么時(shí)候.class字節(jié)碼文件中加載這個(gè)類到JVM內(nèi)存里來(lái)? ②驗(yàn)證、準(zhǔn)備、初始化 ③初始化 2.類加載器和雙親委派機(jī)制 ...

    Betta 評(píng)論0 收藏0
  • Java的加載機(jī)制

    摘要:如果需要支持類的動(dòng)態(tài)加載或需要對(duì)編譯后的字節(jié)碼文件進(jìn)行解密操作等,就需要與類加載器打交道了。雙親委派模型,雙親委派模型,約定類加載器的加載機(jī)制。任何之類的字節(jié)碼都無(wú)法調(diào)用方法,因?yàn)樵摲椒ㄖ荒茉陬惣虞d的過程中由調(diào)用。 jvm系列 垃圾回收基礎(chǔ) JVM的編譯策略 GC的三大基礎(chǔ)算法 GC的三大高級(jí)算法 GC策略的評(píng)價(jià)指標(biāo) JVM信息查看 GC通用日志解讀 jvm的card table數(shù)據(jù)...

    aervon 評(píng)論0 收藏0
  • 淺談java classloader

    摘要:類加載器三杰有三類,分別是以及。線程上下文類加載器線程上下文類加載器可以不遵循雙親委派機(jī)制。免費(fèi)領(lǐng)取驗(yàn)證碼內(nèi)容安全短信發(fā)送直播點(diǎn)播體驗(yàn)包及云服務(wù)器等套餐更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營(yíng)經(jīng)驗(yàn)分享請(qǐng)?jiān)L問網(wǎng)易云社區(qū)。文章來(lái)源網(wǎng)易云社區(qū) 本文由作者張遠(yuǎn)道授權(quán)網(wǎng)易云社區(qū)發(fā)布。 類加載器三杰 jvm有三類classloader,分別是bootstrap classloader,extended classlo...

    liuyix 評(píng)論0 收藏0
  • JVM_加載機(jī)制詳解

    摘要:加載器種類啟動(dòng)類加載器在中用來(lái)加載自身需要的類,實(shí)現(xiàn),用來(lái)加載。那么就能保證的類會(huì)被優(yōu)先加載,限制了使用者對(duì)系統(tǒng)的影響。這種方式下就完成類加載器的雙親委派機(jī)制此處會(huì)將作為參數(shù)傳入進(jìn)去實(shí)際上是調(diào)用了方法 Class 文件的裝載流程 (類加載過程) 加載 -> 連接 (驗(yàn)證 -> 準(zhǔn)備 -> 解析) -> 初始化 -> 使用 -> 卸載 加載 加載階段,jvm 會(huì)通過類名獲取到此類的字節(jié)碼...

    MasonEast 評(píng)論0 收藏0
  • JVM 的 工作原理,層次結(jié)構(gòu) 以及 GC工作原理

    摘要:執(zhí)行引擎作用執(zhí)行字節(jié)碼,或者執(zhí)行本地方法運(yùn)行時(shí)數(shù)據(jù)區(qū)其實(shí)就是指在運(yùn)行期間,其對(duì)內(nèi)存空間的劃分和分配。 雖是讀書筆記,但是如轉(zhuǎn)載請(qǐng)注明出處https://uestc-dpz.github.io..拒絕伸手復(fù)制黨 JVM Java 虛擬機(jī) Java 虛擬機(jī)(Java virtual machine,JVM)是運(yùn)行 Java 程序必不可少的機(jī)制。JVM實(shí)現(xiàn)了Java語(yǔ)言最重要的特征:即平臺(tái)...

    qqlcbb 評(píng)論0 收藏0
  • JVM 知識(shí)點(diǎn) 01

    摘要:新生代又被劃分為三個(gè)區(qū)域和兩個(gè)幸存區(qū)。這樣劃分的目的是為了使能夠更好地管理堆內(nèi)存中的對(duì)象,包括內(nèi)存的分配及回收。新生代主要存儲(chǔ)新創(chuàng)建的對(duì)象和尚未進(jìn)入老年代的對(duì)象。 在Java中主要有以下三種類加載器: 引導(dǎo)類加載器(bootstrap class loader) --用來(lái)加載java的核心庫(kù)(Strin...

    不知名網(wǎng)友 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<