JVM類(lèi)加載機(jī)制及生命周期的詳細(xì)介紹

這篇文章主要講解了“JVM類(lèi)加載機(jī)制及生命周期的詳細(xì)介紹”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“JVM類(lèi)加載機(jī)制及生命周期的詳細(xì)介紹”吧!

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括漠河網(wǎng)站建設(shè)、漠河網(wǎng)站制作、漠河網(wǎng)頁(yè)制作以及漠河網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,漠河網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到漠河省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

一.目標(biāo):

1.什么是類(lèi)的加載?

2.類(lèi)的生命周期?

3.類(lèi)加載器是什么?

4.雙親委派機(jī)制是什么?

二.原理 (類(lèi)的加載過(guò)程及其最終產(chǎn)品):

JVM將class文件字節(jié)碼文件加載到內(nèi)存中, 并將這些靜態(tài)數(shù)據(jù)轉(zhuǎn)換成方法區(qū)中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),在堆(并不一定在堆中,HotSpot在方法區(qū)中)中生成一個(gè)代表這個(gè)類(lèi)的java.lang.Class 對(duì)象,作為方法區(qū)類(lèi)數(shù)據(jù)的訪問(wèn)入口。

三.過(guò)程(類(lèi)的生命周期):

JVM類(lèi)加載機(jī)制分為五個(gè)部分:加載,驗(yàn)證,準(zhǔn)備,解析,初始化,下面我們就分別來(lái)看一下這五個(gè)過(guò)程。其中加載、檢驗(yàn)、準(zhǔn)備、初始化和卸載這個(gè)五個(gè)階段的順序是固定的,而解析則未必。為了支持動(dòng)態(tài)綁定,解析這個(gè)過(guò)程可以發(fā)生在初始化階段之后。

JVM類(lèi)加載機(jī)制及生命周期的詳細(xì)介紹

加載:

加載過(guò)程主要完成三件事情:

  1. 通過(guò)類(lèi)的全限定名來(lái)獲取定義此類(lèi)的二進(jìn)制字節(jié)流

  2. 將這個(gè)類(lèi)字節(jié)流代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)

  3. 在堆中生成一個(gè)代表此類(lèi)的java.lang.Class對(duì)象,作為訪問(wèn)方法區(qū)這些數(shù)據(jù)結(jié)構(gòu)的入口。

這個(gè)過(guò)程主要就是類(lèi)加載器完成。

校驗(yàn):

此階段主要確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)的自身安全。

  1. 文件格式驗(yàn)證:基于字節(jié)流驗(yàn)證。

  2. 元數(shù)據(jù)驗(yàn)證:基于方法區(qū)的存儲(chǔ)結(jié)構(gòu)驗(yàn)證。

  3. 字節(jié)碼驗(yàn)證:基于方法區(qū)的存儲(chǔ)結(jié)構(gòu)驗(yàn)證。

  4. 符號(hào)引用驗(yàn)證:基于方法區(qū)的存儲(chǔ)結(jié)構(gòu)驗(yàn)證。

準(zhǔn)備:

為類(lèi)變量分配內(nèi)存,并將其初始化為默認(rèn)值。(此時(shí)為默認(rèn)值,在初始化的時(shí)候才會(huì)給變量賦值)即在方法區(qū)中分配這些變量所使用的內(nèi)存空間。例如:

public static int value = 123;

此時(shí)在準(zhǔn)備階段過(guò)后的初始值為0而不是123;將value賦值為123的putstatic指令是程序被編譯后,存放于類(lèi)構(gòu)造器方法之中.特例:

public static final int value = 123;

此時(shí)value的值在準(zhǔn)備階段過(guò)后就是123。

解析:

把類(lèi)型中的符號(hào)引用轉(zhuǎn)換為直接引用。

  • 符號(hào)引用與虛擬機(jī)實(shí)現(xiàn)的布局無(wú)關(guān),引用的目標(biāo)并不一定要已經(jīng)加載到內(nèi)存中。各種虛擬機(jī)實(shí)現(xiàn)的內(nèi)存布局可以各不相同,但是它們能接受的符號(hào)引用必須是一致的,因?yàn)榉?hào)引用的字面量形式明確定義在Java虛擬機(jī)規(guī)范的Class文件格式中。

  • 直接引用可以是指向目標(biāo)的指針,相對(duì)偏移量或是一個(gè)能間接定位到目標(biāo)的句柄。如果有了直接引用,那引用的目標(biāo)必定已經(jīng)在內(nèi)存中存在

主要有以下四種:

  1. 類(lèi)或接口的解析

  2. 字段解析

  3. 類(lèi)方法解析

  4. 接口方法解析

初始化:

初始化階段是執(zhí)行類(lèi)構(gòu)造器方法的過(guò)程。方法是由編譯器自動(dòng)收集類(lèi)中的類(lèi)變量的賦值操作和靜態(tài)語(yǔ)句塊中的語(yǔ)句合并而成的。虛擬機(jī)會(huì)保證方法執(zhí)行之前,父類(lèi)的方法已經(jīng)執(zhí)行完畢。如果一個(gè)類(lèi)中沒(méi)有對(duì)靜態(tài)變量賦值也沒(méi)有靜態(tài)語(yǔ)句塊,那么編譯器可以不為這個(gè)類(lèi)生成()方法。

java中,對(duì)于初始化階段,有且只有以下五種情況才會(huì)對(duì)要求類(lèi)立刻“初始化”(加載,驗(yàn)證,準(zhǔn)備,自然需要在此之前開(kāi)始):

  1. 使用new關(guān)鍵字實(shí)例化對(duì)象、訪問(wèn)或者設(shè)置一個(gè)類(lèi)的靜態(tài)字段(被final修飾、編譯器優(yōu)化時(shí)已經(jīng)放入常量池的例外)、調(diào)用類(lèi)方法,都會(huì)初始化該靜態(tài)字段或者靜態(tài)方法所在的類(lèi)。

  2. 初始化類(lèi)的時(shí)候,如果其父類(lèi)沒(méi)有被初始化過(guò),則要先觸發(fā)其父類(lèi)初始化。

  3. 使用java.lang.reflect包的方法進(jìn)行反射調(diào)用的時(shí)候,如果類(lèi)沒(méi)有被初始化,則要先初始化。

  4. 虛擬機(jī)啟動(dòng)時(shí),用戶會(huì)先初始化要執(zhí)行的主類(lèi)(含有main)

  5. jdk 1.7后,如果java.lang.invoke.MethodHandle的實(shí)例最后對(duì)應(yīng)的解析結(jié)果是 REF_getStatic、REF_putStatic、REF_invokeStatic方法句柄,并且這個(gè)方法所在類(lèi)沒(méi)有初始化,則先初始化。

四.類(lèi)加載器:

把類(lèi)加載階段的“通過(guò)一個(gè)類(lèi)的全限定名來(lái)獲取描述此類(lèi)的二進(jìn)制字節(jié)流”這個(gè)動(dòng)作交給虛擬機(jī)之外的類(lèi)加載器來(lái)完成。這樣的好處在于,我們可以自行實(shí)現(xiàn)類(lèi)加載器來(lái)加載其他格式的類(lèi),只要是二進(jìn)制字節(jié)流就行,這就大大增強(qiáng)了加載器靈活性。系統(tǒng)自帶的類(lèi)加載器分為三種:

  1. 啟動(dòng)類(lèi)加載器。

  2. 擴(kuò)展類(lèi)加載器。

  3. 應(yīng)用程序類(lèi)加載器。

五.雙親委派機(jī)制:

JVM類(lèi)加載機(jī)制及生命周期的詳細(xì)介紹

雙親委派機(jī)制工作過(guò)程:

如果一個(gè)類(lèi)加載器收到了類(lèi)加載器的請(qǐng)求.它首先不會(huì)自己去嘗試加載這個(gè)類(lèi).而是把這個(gè)請(qǐng)求委派給父加載器去完成.每個(gè)層次的類(lèi)加載器都是如此.因此所有的加載請(qǐng)求最終都會(huì)傳送到Bootstrap類(lèi)加載器(啟動(dòng)類(lèi)加載器)中.只有父類(lèi)加載反饋?zhàn)约簾o(wú)法加載這個(gè)請(qǐng)求(它的搜索范圍中沒(méi)有找到所需的類(lèi))時(shí).子加載器才會(huì)嘗試自己去加載。

雙親委派模型的優(yōu)點(diǎn):java類(lèi)隨著它的加載器一起具備了一種帶有優(yōu)先級(jí)的層次關(guān)系.

例如類(lèi)java.lang.Object,它存放在rt.jart之中.無(wú)論哪一個(gè)類(lèi)加載器都要加載這個(gè)類(lèi).最終都是雙親委派模型最頂端的Bootstrap類(lèi)加載器去加載.因此Object類(lèi)在程序的各種類(lèi)加載器環(huán)境中都是同一個(gè)類(lèi).相反.如果沒(méi)有使用雙親委派模型.由各個(gè)類(lèi)加載器自行去加載的話.如果用戶編寫(xiě)了一個(gè)稱為“java.lang.Object”的類(lèi).并存放在程序的ClassPath中.那系統(tǒng)中將會(huì)出現(xiàn)多個(gè)不同的Object類(lèi).java類(lèi)型體系中最基礎(chǔ)的行為也就無(wú)法保證.應(yīng)用程序也將會(huì)一片混亂.

感謝各位的閱讀,以上就是“JVM類(lèi)加載機(jī)制及生命周期的詳細(xì)介紹”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)JVM類(lèi)加載機(jī)制及生命周期的詳細(xì)介紹這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

分享文章:JVM類(lèi)加載機(jī)制及生命周期的詳細(xì)介紹
標(biāo)題來(lái)源:http://www.muchs.cn/article14/ihiode.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、定制網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站收錄、、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站