- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- jvm運行原理以及類(lèi)加載器實(shí)例詳解
首先從“.java”代碼文件,編譯成“.class”字節碼文件,然后類(lèi)加載器將“.class”字節碼文件中的類(lèi)給加載帶JVM中,最后就是JVM執行寫(xiě)好的代碼。執行過(guò)程如下圖
類(lèi)加載過(guò)程
加載 -> 驗證 -> 準備 -> 解析 -> 初始化 -> 使用 -> 卸載
加載
一旦JVM進(jìn)程啟動(dòng)之后,一定會(huì )先把類(lèi)加載到內存中,然后從main()方法的入口代碼開(kāi)始執行
public class HelloWorld { public static void main(String[] args) { } }
加載指是將類(lèi)CLass文件讀入到內存中,并創(chuàng )建一個(gè)java.lang.Class對象
類(lèi)的加載器由類(lèi)加載器完成,類(lèi)加載器通常由JVM提供,除此之外,可以通過(guò)繼承ClassLoader基類(lèi)來(lái)創(chuàng )建自己的類(lèi)加載器
通過(guò)使用不同的類(lèi)加載器,可以從不同來(lái)源加載類(lèi)的二進(jìn)制數據
準備階段
驗證
根據Java虛擬機規范,來(lái)校驗加載進(jìn)來(lái)的“.class”文件中的內容,是否符合指定的規范,如果“.class”文件被人篡改,里面的字節碼不符合規范,那么JVM是沒(méi)法執行這個(gè)字節碼。所在把“.class”文件加載到內存后,必須先驗證一下,檢驗他必須完全符合JVM規范,才交給JVM來(lái)運行。其主要包括四種驗證,文件格式驗證,元數據驗證,字節碼驗證,符號引用驗證
準備
給引用的類(lèi)分配一定的內存空間,然后給里面的類(lèi)變量(也就是static修飾的變量)分配內存空間,來(lái)一個(gè)默認的初始值
解析
實(shí)際上是把將類(lèi)的二進(jìn)制數據中的符號引用替換成直接引用的過(guò)程,這個(gè)部分的內容比較復雜,設計到JVM的底層
解析主要包括:
初始化
初始化是為類(lèi)的靜態(tài)變量賦予正確的初始值,準備階段和初始化階段看似有點(diǎn)矛盾,其實(shí)是不矛盾的,如果類(lèi)中有語(yǔ)句:private static int a = 10,它的執行過(guò)程是這樣的,首先字節碼文件被加載到內存后,先進(jìn)行鏈接的驗證這一步驟,驗證通過(guò)后準備階段,給a分配內存,因為變量a是static的,所以此時(shí)a等于int類(lèi)型的默認初始值0,即a=0,然后到解析(后面在說(shuō)),到初始化這一步驟時(shí),才把a的真正的值10賦給a,此時(shí)a=10
一個(gè)非常重要的規則,就是如果初始化一個(gè)類(lèi)的時(shí)候,發(fā)現他的父類(lèi)還沒(méi)初始化,那么必須先初始化他的父類(lèi)
啟動(dòng)類(lèi)/根類(lèi)加載器
Bootstrap ClassLoader,他主要是負責加載我們在機器上安裝的Java目錄下的核心類(lèi)的,是用原生代碼來(lái)實(shí)現的,并不繼承自 java.lang.ClassLoader(負責加載$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++實(shí)現,不是ClassLoader子類(lèi))。由于引導類(lèi)加載器涉及到虛擬機本地實(shí)現細節,開(kāi)發(fā)者無(wú)法直接獲取到啟動(dòng)類(lèi)加載器的引用,所以不允許直接通過(guò)引用進(jìn)行操作
擴展類(lèi)加載器
Extension ClassLoader,負責加載JRE的擴展目錄,lib/ext或者由java.ext.dirs系統屬性指定的目錄中的JAR包的類(lèi)。由Java語(yǔ)言實(shí)現,父類(lèi)加載器為null
應用程序類(lèi)加載器
Application ClassLoader,被稱(chēng)為應用(也稱(chēng)為系統)類(lèi)加載器,它負責在JVM啟動(dòng)時(shí)加載來(lái)自Java命令的-classpath選項、java.class.path系統屬性,或者CLASSPATH換將變量所指定的JAR包和類(lèi)路徑。程序可以通過(guò)ClassLoader的靜態(tài)方法getSystemClassLoader()來(lái)獲取系統類(lèi)加載器。如果沒(méi)有特別指定,則用戶(hù)自定義的類(lèi)加載器都以此類(lèi)加載器作為父加載器。由Java語(yǔ)言實(shí)現,父類(lèi)加載器為ExtClassLoader。
類(lèi)加載器加載Class大致要經(jīng)過(guò)如下8個(gè)步驟:
自定義類(lèi)加載器
除了上面那幾種之外,還可以自定義類(lèi)加載器,去根據你自己的需求加載你的類(lèi)
JVM的類(lèi)加載機制主要有如下3種:
雙親委派機制
這就是所謂的**雙親委派模型:**先找父親去加載,不行的話(huà)再由兒子來(lái)加載
到此這篇關(guān)于jvm運行原理以及類(lèi)加載器的文章就介紹到這了,更多相關(guān)jvm運行原理及類(lèi)加載器內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站