日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
看完這篇后,別再說(shuō)你不懂JVM類加載機(jī)制了~

看完這篇后,別再說(shuō)你不懂JVM類加載機(jī)制了~

作者:碼上Java 2021-06-16 00:57:16
云計(jì)算
虛擬化 JVM 通過(guò)雙親委派模型進(jìn)行類的加載,即當(dāng)某個(gè)類加載器在接到加載類的請(qǐng)求時(shí),首先將加載任務(wù)委托給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務(wù),就成功返回;只有父類加載器無(wú)法完成此加載任務(wù)時(shí),才自己去加載。

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、隆昌ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的隆昌網(wǎng)站制作公司

JVM 通過(guò)雙親委派模型進(jìn)行類的加載,即當(dāng)某個(gè)類加載器在接到加載類的請(qǐng)求時(shí),首先將加載任務(wù)委托給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務(wù),就成功返回;只有父類加載器無(wú)法完成此加載任務(wù)時(shí),才自己去加載。

類加載器

  • 啟動(dòng)類加載器 (Bootstrap ClassLoader) :負(fù)責(zé)加載 JAVA_HOME\lib 目錄中的,或通過(guò) - Xbootclasspath 參數(shù)指定路徑中的,且被虛擬機(jī)認(rèn)可(按文件名識(shí)別,如 rt.jar,名字不符合的類庫(kù)即使放在 lib 目錄也不會(huì)被加載)的類。啟動(dòng)類加載器無(wú)法被 Java 程序直接引用;
  • 擴(kuò)展類加載器 (Extension ClassLoader) :負(fù)責(zé)加載 JAVA_HOME\jre\lib\ext 目錄中的,或通過(guò) java.ext.dirs 系統(tǒng)變量指定路徑中的類庫(kù);
  • 應(yīng)用程序類加載器 (Application ClassLoader) :負(fù)責(zé)加載用戶路徑(classpath)上的類庫(kù)。
  • 通過(guò)繼承 java.lang.ClassLoader 類實(shí)現(xiàn)自定義類加載器(主要是重寫 findClass 方法)。

小結(jié): 類加載器和字節(jié)碼是Java平臺(tái)無(wú)關(guān)性的基石,對(duì)于任意一個(gè)類,都需要由它的類加載器和這個(gè)類本身一同確立其在Java虛擬機(jī)中的唯一性。

雙親委派模型的優(yōu)點(diǎn):

  • 基礎(chǔ)類的統(tǒng)一加載問(wèn)題(越基礎(chǔ)的類由越上層的加載器進(jìn)行加載)。如類 java.lang.String,無(wú)論哪一個(gè)類加載器要加載這個(gè)類,最終都是委派給啟動(dòng)類加載器進(jìn)行加載,所以在程序的各種類加載器環(huán)境中都是同一個(gè)類。
  • 提高 java 代碼的安全性。比如說(shuō)用戶自定義了一個(gè)與系統(tǒng)庫(kù)里同名的 java.lang.String 類,那么這個(gè)類就不會(huì)被加載,因?yàn)樽铐攲拥念惣虞d器會(huì)首先加載系統(tǒng)的 java.lang.String 類,而不會(huì)加載自定義的 String 類,防止了惡意代碼的注入。
  • 可以避免類的重復(fù)加載,另外也避免了 Java 的核心 API 被篡改。

類加載流程

類的生命周期會(huì)經(jīng)歷以下 7 個(gè)階段:

加載階段

此階段用于查到相應(yīng)的類(通過(guò)類名進(jìn)行查找)并將此類的字節(jié)流轉(zhuǎn)換為方法區(qū)運(yùn)行時(shí)的數(shù)據(jù)結(jié)構(gòu),然后再在內(nèi)存中生成一個(gè)能代表此類的 java.lang.Class 對(duì)象,作為其他數(shù)據(jù)訪問(wèn)的入口。

驗(yàn)證階段

此步驟主要是為了驗(yàn)證字節(jié)碼的安全性,如果不做安全校驗(yàn)的話可能會(huì)載入非安全或有錯(cuò)誤的字節(jié)碼,從而導(dǎo)致系統(tǒng)崩潰,它是 JVM 自我保護(hù)的一項(xiàng)重要舉措。

驗(yàn)證的主要?jiǎng)幼鞔蟾庞幸韵聨讉€(gè):

  • 文件格式校驗(yàn)包括常量池中的常量類型、Class 文件的各個(gè)部分是否被刪除或被追加了其他信息等;
  • 元數(shù)據(jù)校驗(yàn)包括父類正確性校驗(yàn)(檢查父類是否有被 final 修飾)、抽象類校驗(yàn)等;
  • 字節(jié)碼校驗(yàn),此步驟最為關(guān)鍵和復(fù)雜,主要用于校驗(yàn)程序中的語(yǔ)義是否合法且符合邏輯;
  • 符號(hào)引用校驗(yàn),對(duì)類自身以外比如常量池中的各種符號(hào)引用的信息進(jìn)行匹配性校驗(yàn)。

準(zhǔn)備階段

此階段是用來(lái)初始化并為類中定義的靜態(tài)變量分配內(nèi)存的,這些靜態(tài)變量會(huì)被分配到方法區(qū)上。

HotSpot 虛擬機(jī)在 JDK 1.7 之前都在方法區(qū),而 JDK 1.8 之后此變量會(huì)隨著類對(duì)象一起存放到 Java 堆中。

解析階段

此階段主要是用來(lái)解析類、接口、字段及方法的,解析時(shí)會(huì)把符號(hào)引用替換成直接引用。

所謂的符號(hào)引用是指以一組符號(hào)來(lái)描述所引用的目標(biāo),符號(hào)可以是任何形式的字面量,只要使用時(shí)能無(wú)歧義地定位到目標(biāo)即可;而直接引用是可以直接指向目標(biāo)的指針、相對(duì)偏移量或者是一個(gè)能間接定位到目標(biāo)的句柄。

符號(hào)引用和直接引用有一個(gè)重要的區(qū)別:使用符號(hào)引用時(shí)被引用的目標(biāo)不一定已經(jīng)加載到內(nèi)存中;而使用直接引用時(shí),引用的目標(biāo)必定已經(jīng)存在虛擬機(jī)的內(nèi)存中了。

初始化

初始化階段 JVM 就正式開(kāi)始執(zhí)行類中編寫的 Java 業(yè)務(wù)代碼了。到這一步驟之后,類的加載過(guò)程就算正式完成了。

總結(jié)

如上圖所示,淺綠的兩個(gè)部分表示類的生命周期,就是從類的加載到類實(shí)例的創(chuàng)建與使用,再到類對(duì)象不再被使用時(shí)可以被 GC 卸載回收。

這里要注意一點(diǎn),由 Java 虛擬機(jī)自帶的三種類加載器加載的類在虛擬機(jī)的整個(gè)生命周期中是不會(huì)被卸載的,只有用戶自定義的類加載器所加載的類才可以被卸載。


分享標(biāo)題:看完這篇后,別再說(shuō)你不懂JVM類加載機(jī)制了~
瀏覽地址:http://www.5511xx.com/article/djpdhce.html