溫馨提示×

溫馨提示×

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

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

JVM類加載機制的示例分析

發(fā)布時間:2022-01-14 10:57:46 來源:億速云 閱讀:108 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要為大家展示了“JVM類加載機制的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“JVM類加載機制的示例分析”這篇文章吧。

一、類加載簡介

類的加載機制是指把編譯后的.class類文件的二進制數(shù)據(jù)讀取到內存中,并為之創(chuàng)建一個java.lang.Class對象,用來封裝類在元數(shù)據(jù)空間的數(shù)據(jù)結構。

JVM類加載機制的示例分析

類在JVM中的生命周期為:加載,連接,初始化,使用,卸載。不過這里只重點描述加載,連接,初始化這三個過程。

二、加載過程

基于一張圖看類加載子系統(tǒng)的細節(jié)流程:

JVM類加載機制的示例分析

1、加載階段

過程描述

加載階段需要完成以下三個過程:

  • 通過類的全限定名來獲取其定義的二進制字節(jié)流;

  • 將字節(jié)流所代表的靜態(tài)存儲結構轉化為云數(shù)據(jù)空間的運行時數(shù)據(jù)結構;

  • 在堆Heap中生成一個代表這個類的java.lang.Class對象,作為對元數(shù)據(jù)空間中這些數(shù)據(jù)的訪問入口;

類加載器

  • 引導類加載器

Bootstrap-ClassLoader基于C/C++實現(xiàn),負責加載Java的核心類庫JAVA_HOME\jre\lib\rt.jar,該加載器不繼承自ClassLoader抽象類,并且只加載包名為java、javax、sun等開頭類,一次保證對核心源碼的保護。

  • 擴展類加載器

Extension-ClassLoader,基于Java語言,由sun.misc.Launcher$ExtClassLoader實現(xiàn),派生于ClassLoader抽象類,從java.ext.dirs系統(tǒng)變量指定的路徑中的加載類庫,或者JDK安裝目錄jre\lib\ext目錄下加載。

  • 系統(tǒng)類加載器

Application-ClassLoader,基于Java語言,由sun.misc.Launcher$ExtClassLoader實現(xiàn),它負責加載環(huán)境變量ClassPath指定的類庫,如果在應用程序中沒有自定義類加載器,一般情況下作為程序中默認的類加載器。

2、連接階段

驗證

目的在于確保Class文件的字節(jié)流中包含的信息符合當前虛擬機的要求,保證加載類的正確性,不會危害虛擬機自身的安全,主要包括四種檢驗動作:

  • 文件格式驗證:驗證字節(jié)流是否符合Class文件格式的規(guī)范;

  • 元數(shù)據(jù)驗證:確保其描述的信息符合Java語言規(guī)范的要求;

  • 字節(jié)碼驗證:確定程序語義是符合邏輯的;

  • 符號引用驗證:確保解析動作能正確執(zhí)行。

準備

為類的靜態(tài)變量分配內存,并初始化為默認值,這時候進行內存分配的僅包括類變量(static)修飾,不包括(final-static)修飾的,這里也不會為實例變量分配初始化,實例變量會隨著對象一塊分配到Java堆中。

解析

將常量池中的符號引用轉換為直接引用的過程,直接引用就是直接指向目標的指針、相對偏移量或一個間接定位到目標的句柄。解析主要針對類或接口、字段、類方法、接口方法、方法類型等,解析的動作實際是會隨著JVM在執(zhí)行完初始化之后再執(zhí)行的。

3、初始化階段

執(zhí)行類構造器clinit()方法的過程,該方法不需要自定義,是javac編譯器自動收集類中的所有類變量的賦值動作和靜態(tài)代碼塊中的語句合并而來,Jvm要保證clinit()方法在多線程訪問下的安全性。

三、機制策略

1、雙親委派模式

JVM類加載機制的示例分析

類加載器收到了類加載的請求時,不會自己先去嘗試加載這個類,而是把請求委托給父加載器去執(zhí)行;

如果父加載器還存在父類加載器,則依次向上委托,因此類加載請求最終都應該被傳遞到頂層的啟動類加載器中;

如果父類加載器可以完成類加載請求,就直接成功返回,只有當父加載器在無法完成該加載,子加載器才會嘗試自己去加載該類;

2、沙箱安全機制

假設自定義一個類名為String且所在包為java.lang,在使用引導類加載器加載時會先加載JDK中的String類,因為這個類本來是屬于jdk的,后面再次出現(xiàn)String類就會報錯,以此保證源代碼不被惡意篡改,這就是沙箱安全機制。

以上是“JVM類加載機制的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

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

jvm
AI