您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“JVM類加載機制的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“JVM類加載機制的示例分析”這篇文章吧。
類的加載機制是指把編譯后的.class類文件的二進制數(shù)據(jù)讀取到內存中,并為之創(chuàng)建一個java.lang.Class對象,用來封裝類在元數(shù)據(jù)空間的數(shù)據(jù)結構。
類在JVM中的生命周期為:加載,連接,初始化,使用,卸載。不過這里只重點描述加載,連接,初始化這三個過程。
基于一張圖看類加載子系統(tǒng)的細節(jié)流程:
過程描述
加載階段需要完成以下三個過程:
通過類的全限定名來獲取其定義的二進制字節(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指定的類庫,如果在應用程序中沒有自定義類加載器,一般情況下作為程序中默認的類加載器。
驗證
目的在于確保Class文件的字節(jié)流中包含的信息符合當前虛擬機的要求,保證加載類的正確性,不會危害虛擬機自身的安全,主要包括四種檢驗動作:
文件格式驗證:驗證字節(jié)流是否符合Class文件格式的規(guī)范;
元數(shù)據(jù)驗證:確保其描述的信息符合Java語言規(guī)范的要求;
字節(jié)碼驗證:確定程序語義是符合邏輯的;
符號引用驗證:確保解析動作能正確執(zhí)行。
準備
為類的靜態(tài)變量分配內存,并初始化為默認值,這時候進行內存分配的僅包括類變量(static)修飾,不包括(final-static)修飾的,這里也不會為實例變量分配初始化,實例變量會隨著對象一塊分配到Java堆中。
解析
將常量池中的符號引用轉換為直接引用的過程,直接引用就是直接指向目標的指針、相對偏移量或一個間接定位到目標的句柄。解析主要針對類或接口、字段、類方法、接口方法、方法類型等,解析的動作實際是會隨著JVM在執(zhí)行完初始化之后再執(zhí)行的。
執(zhí)行類構造器clinit()方法的過程,該方法不需要自定義,是javac編譯器自動收集類中的所有類變量的賦值動作和靜態(tài)代碼塊中的語句合并而來,Jvm要保證clinit()方法在多線程訪問下的安全性。
類加載器收到了類加載的請求時,不會自己先去嘗試加載這個類,而是把請求委托給父加載器去執(zhí)行;
如果父加載器還存在父類加載器,則依次向上委托,因此類加載請求最終都應該被傳遞到頂層的啟動類加載器中;
如果父類加載器可以完成類加載請求,就直接成功返回,只有當父加載器在無法完成該加載,子加載器才會嘗試自己去加載該類;
假設自定義一個類名為String且所在包為java.lang,在使用引導類加載器加載時會先加載JDK中的String類,因為這個類本來是屬于jdk的,后面再次出現(xiàn)String類就會報錯,以此保證源代碼不被惡意篡改,這就是沙箱安全機制。
以上是“JVM類加載機制的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。