亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

java類的加載過程以及類加載器的分析

2024-07-14 08:41:54
字體:
來源:轉載
供稿:網友

我們知道,我們寫的java代碼保存的格式是 .java, java文件被編譯后會轉換為字節碼,字節碼可以在任何平臺通過java虛擬機來運行,這也是java能夠跨平臺的原因。

那JVM是如何來讓我們寫的java文件運行的呢? 這個問題通常的問法好像是:類是如何被加載的。

記得第一次遇見這個問題的時候,同學給我的回答是:

1.虛擬機會加載JDK里類的核心包

2.虛擬機會加載JDK里類的擴展包

3.虛擬機會加載JDK里類的系統包

4.虛擬機再會加載我們寫好的java類。

初學的時候,大家都這么說,好像也沒發現什么錯。 最近在瀏覽一些博客時看到一些更為詳細的講解,如java類加載全過程,該博文有一萬多的點擊,但感覺還是講得不夠詳細,說了類的加載過程有哪些,但沒有詳細的展開,說了一些類初始化的細節。 在翻讀《深入理解Java虛擬機》209-235頁后,總結了其內容,談談自己對該部分的理解吧。

希望大家看了之后更能理解JVM的工作原理和java類的生產過程(類加載的過程);

類從被加載到虛擬機類存中開始,到被卸載出內存為止,它的整個生命周期包括

加載 → 驗證 → 準備 → 解析 → 初始化 → 使用 → 卸載 7個部分、

下面我就來詳細的說說每個部分的詳細過程,再補充一下雙親委派模型。

再次之前我想補充一個名詞解釋,類加載器:虛擬機把 實現 類加載階段中的“通過一個類的全限定名來獲取描述此類的二進制字節流” 這個過程的代碼稱為類加載器

1. 加載

加載只是類加載過程的一個階段而已,但往往被大家弄成了這就是類的加載過程,所以才有了博文開頭時同學給我的那個回答;

希望大家不要混淆出這個很相似的名詞,從而對類加載有所誤讀。

1.JDK在執行程序運行命令時會去JRE目錄中找到jvm.dll , 并初始化JVM

這時會產生一個Bootstrap Loader(啟動類加載器)

2.Bootstrap Loader 自動加載 Extended Loader(標準擴展類加載器)

3.Bootstrap Loader 自動加載 AppClass Loader(系統類加載器)

4.最后由 AppClass Loader 加載 我們指定(想要運行)的 java 類

這里可以提一下雙親委派模型加載類的方式:

實現雙親委派的代碼都集中在java.lang.ClassLoader的 loadClass()方法中, 源碼我就不貼出來了;

其源碼大概意思如下:

1.先檢查此類是否被加載過,若沒有加載則調用父加載器的loadClass()方法,

2.若父加載器為空,則默認使用啟動類加載器作為父加載器,

3.若父類加載失敗,會拋出一個異常,然后再調用自己的findClass()方法來進行加載;

結合第一步加載可以這么理解,

1.首先要啟動→ 啟動類加載器,這時會調用啟動類加載器的父加載器,但由于啟動類加載器時所有類的父加載器,
所以其父加載器為空(相當于Object是所有類的父類,這種感腳~),然后它就會調用自己的findClass方法來自啟動加載 ;

2.標準擴展類加載器啟動時就會借助其父類 啟動類加載器 作為父加載器 來啟動了;

3.系統類加載器啟動時就會借助其父類 標準擴展類加載器 作為父加載器 來啟動了;

4.最后我們編寫的普通類就會借助其父類 系統類加載器 作為父加載器 來啟動了;

2.驗證

驗證主要分為以下幾個步驟:文件格式驗證->元數據驗證->字節碼驗證->符號引用驗證

1.文件格式驗證:主要是檢查字節碼的字節流是否符合Class文件格式的規范,驗證該文件是否能被當前的 jvm 所處理,
如果沒問題,字節里就可以進入方法區進行保存了;

2.元數據驗證:對字節碼描述的信息進行語義分析,保證其描述的內容符合java語言的語法規范,能被java虛擬機識別;

3.字節碼驗證:該部分最為復雜,對方法體內的內容進行驗證,保證代碼在運行時不會做出什么危害虛擬機安全的事件;

4.符號引用驗證:來驗證一些引用的真實性與可行性,比如代碼里面引了其他類(符號中通過字符串描述的全限定名是否能找到對應的類),這里就要去檢測一下那些來究竟是否存在;或者說代碼中訪問了其他類的一些屬性,這里就對那些屬性的可以訪問行進行了檢驗。(這一步將為后面的解析工作打下基礎)

多說兩句。。。 我覺得這個驗證就是看class文件符不符合 JVM 的胃口 , 如果不符合 JVM 的胃口的話,無法完成加載,說明你寫的代碼 有毒.... 偷笑偷笑

3.準備

準備階段會為類變量(指的是靜態變量,這就是我們常說的,靜態變量/方法 在類加載的時候就執行了,通過類名.靜態**來調用)分配內存并設置類的初始值; 值得一提的是 如果有以下語句:

public static int i = 123 ;

在準備階段的初始值是 0 ,而不是 123 , 是因為此時 只是分配內存空間而已, 并沒有對 i 進行初始化, 真正的對 i 賦值是在 初始化 階段;

4.解析

1.類或接口的解析;

2.字段解析;

3.類方法解析;

4.接口方法解析;

此部分內容涉及 invokedynamic指令,靜態、動態語音調用 不做展開

如果解析到代碼內容有問題,解析不通過將會拋出異常!

5.初始化

類初始化階段是類加載過程中的最后一步,這才是執行類中定義的java程序代碼(也可以說是字節碼)。
在準備階段,已經為變量賦過一次系統要求的初始值,到了初始化階段會根據程序員的要求出初始化變量賦值。

Java虛擬機沒有嚴格約束什么時候開始類加載過程的第一階段,但嚴格規定了有且只有5鐘情況必須立即馬上光速對類進行 初始化 

當然加載、驗證、準備需要在次之前,(解析也可以在初始化以后再開始~)

1.遇到new,get static,put static,invoke static這4條字節碼指令時,假如類還沒進行初始化,則馬上對其進行初始化工作。
也就是三種情況:用new實例化一個對象時、讀取或設置一個雷的靜態字段時、執行靜態方法時;

2.使用java.lang.reflect.*的方法對類進行反射調用時,如果類還沒有進行過初始化,立即馬上光速對其進行初始化?。。?/p>

3.初始化一個類的時候,如果其父類還沒有被初始化,那么會先去初始化其父類;

4.當 JVM 啟動時,用戶需要指定一個要執行的主類(包含static void main(String 【】args)的那個類),則JVM會先去初始化這個類;

5.當使用JDK1.7 的動態語言支持時,如果一個java.lang.invoke.MethodHandle實力最后的解析結果為 get static,put static,invoke static 的方法句柄,并且這個方法句柄所對應的類沒有進行過初始化,則需要先初始化;

小結:

介紹了類加載過程的 加載、驗證、準備、解析、初始化、等5個階段,以及虛擬機進行了哪些動作,簡單敘述了類加載器的工作原理,如果有說得不妥當的地方,還以請大家批評指正,多多交流。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲人成网站在线观看| 欧美视频专区一二在线观看| 国产丝袜精品视频| 伊人成人开心激情综合网| 欧美日韩国产精品专区| 亚洲国产精品va在线观看黑人| 日本精品一区二区三区在线播放视频| 久久久久久中文| 国产亚洲精品久久久久久牛牛| 国产成人啪精品视频免费网| 亚洲剧情一区二区| 久久成人国产精品| 国产精品丝袜久久久久久高清| 在线观看欧美视频| 亚洲精品91美女久久久久久久| 欧美性极品xxxx做受| 久久久久久91| 久久色免费在线视频| 久久国产精品久久国产精品| 国产午夜精品一区二区三区| 久久99热精品| 97视频免费观看| 韩国精品美女www爽爽爽视频| 欧美专区第一页| 国产成人精品久久二区二区91| 国产精品视频不卡| 国产免费一区二区三区香蕉精| 日日狠狠久久偷偷四色综合免费| 国产精品日韩专区| 成人午夜激情网| 91在线视频九色| 中文字幕亚洲综合久久筱田步美| 亚洲精品在线观看www| 久久亚洲精品一区二区| 中文在线不卡视频| 日韩欧美高清在线视频| 国产精品久久激情| 亚洲免费一级电影| 中文字幕在线看视频国产欧美| 欧美福利在线观看| 日韩欧美a级成人黄色| 日本一区二区三区在线播放| 欧美日韩在线视频一区| 日韩精品视频在线| 欧美激情精品久久久久久大尺度| 欧美黑人一级爽快片淫片高清| 久久激情视频久久| 日本精品久久中文字幕佐佐木| 国产一区二区视频在线观看| 欧美高清自拍一区| 欧洲午夜精品久久久| 久久久91精品国产一区不卡| 久久精品成人欧美大片| 精品一区二区三区三区| 亚洲一级黄色片| 成人免费网站在线| 欧美激情第6页| 最近2019年好看中文字幕视频| 国产精品爽爽ⅴa在线观看| 日韩在线观看免费全| 日韩成人中文电影| 国产一区二区久久精品| 亚洲乱码一区av黑人高潮| 91国产视频在线播放| 亚洲成人激情图| 国产丝袜一区二区三区| 欧美日韩国产中文字幕| 久久精品国产69国产精品亚洲| 欧美日韩国产成人在线| 大胆欧美人体视频| 精品国产网站地址| 久久人人爽人人爽人人片av高清| 国产成人精品视| 亚洲精品一区二区在线| 成人网址在线观看| 97**国产露脸精品国产| 精品免费在线视频| 欧美丰满少妇xxxxx| 久久久之久亚州精品露出| 欧美最猛性xxxxx(亚洲精品)| 日本精品免费一区二区三区| 亚洲在线免费视频| 国产深夜精品福利| 日韩国产在线看| 久久久久久伊人| 国产精品美女久久久久av超清| 成人性生交xxxxx网站| 亚洲色图综合网| 97国产精品久久| 国产精品久久9| 免费99精品国产自在在线| 九九久久国产精品| 亚洲一区二区三区在线免费观看| 精品久久久久久久中文字幕| 中文字幕亚洲综合久久| 亚洲精品小视频在线观看| 久久视频国产精品免费视频在线| 亚洲一区二区在线播放| 国产综合久久久久| 精品激情国产视频| 午夜精品久久久久久99热软件| 国产精品2018| 亚洲国产中文字幕在线观看| 亚洲成人av资源网| 欧美美女操人视频| 日韩成人av网| 日韩国产精品视频| 亚洲午夜未删减在线观看| 国产精品美女午夜av| 精品美女永久免费视频| 久久久精品国产亚洲| 国产精品一二三在线| 久久久久久久久中文字幕| 国产精品爽爽爽爽爽爽在线观看| 欧美日韩一二三四五区| 欧美美女15p| 国产精品黄页免费高清在线观看| 国语对白做受69| 亚洲自拍欧美色图| 国产91在线播放九色快色| 国产精品免费网站| 亚洲码在线观看| 精品国内产的精品视频在线观看| 日韩久久午夜影院| 美女黄色丝袜一区| 国产精品自产拍在线观| 欧美放荡办公室videos4k| 国产v综合ⅴ日韩v欧美大片| 成人激情视频小说免费下载| 欧美日韩国产影院| 欧美极品xxxx| 成人羞羞国产免费| 欧美黑人性生活视频| 成人黄色激情网| 久久久久久成人精品| 国产精品18久久久久久麻辣| 久久久人成影片一区二区三区| 91久久精品日日躁夜夜躁国产| 亚洲永久在线观看| 亚洲精品国产综合久久| 亚洲午夜性刺激影院| 国产一区视频在线播放| 国产欧美日韩免费| 97久久精品在线| 国内精品国产三级国产在线专| 国产精品69久久| 亚洲自拍偷拍区| 久久精品国产亚洲精品| 日韩在线免费视频| 全球成人中文在线| 国产免费成人av| 久久成人免费视频| 欧美精品videossex性护士| 欧美日韩成人精品| 久久久中精品2020中文| 热久久免费国产视频| 欧美男插女视频| 日韩精品在线免费播放| 亚洲免费视频在线观看| 久久夜精品香蕉| 日韩精品在线电影| 77777少妇光屁股久久一区| 欧美日本黄视频| 亚洲国产精品成人一区二区|