最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM加載一個(gè)類的過程

 更新時(shí)間:2017年02月09日 11:34:26   作者:LSPZ  
本文主要介紹了JVM加載一個(gè)類的過程。具有很好的參考價(jià)值,下面跟著小編一起來看下吧

類的加載過程

Java源代碼被編譯成class字節(jié)碼,JVM把描述類數(shù)據(jù)的字節(jié)碼.Class文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的java類型,這就是虛擬機(jī)的類加載機(jī)制。

類從被加載到虛擬機(jī)內(nèi)存中開始,到卸載出內(nèi)存為止,它的生命周期包括了:加載(Loading)、驗(yàn)證(Verification)、準(zhǔn)備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸載(Unloading)七個(gè)階段,其中驗(yàn)證、準(zhǔn)備、解析三個(gè)部分統(tǒng)稱鏈接。

加載(裝載)、驗(yàn)證、準(zhǔn)備、初始化和卸載這五個(gè)階段順序是固定的,類的加載過程必須按照這種順序開始,而解析階段不一定;它在某些情況下可以在初始化之后再開始,這是為了運(yùn)行時(shí)動(dòng)態(tài)綁定特性(也稱為動(dòng)態(tài)綁定或者晚期綁定,例如重寫)。

1.加載:

在加載階段,虛擬機(jī)主要完成三件事:

1.通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流。

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

3.在Java堆中生成一個(gè)代表這個(gè)類的java.lang.Class對(duì)象,作為方法區(qū)域數(shù)據(jù)的訪問入口

相對(duì)于類加載過程的其他階段,加載階段(準(zhǔn)備地說,是加載階段中獲取類的二進(jìn)制字節(jié)流的動(dòng)作)是開發(fā)期可控性最強(qiáng)的階段,因?yàn)榧虞d階段可以使用系統(tǒng)提供的類加載器(ClassLoader)來完成,也可以由用戶自定義的類加載器完成,開發(fā)人員可以通過定義自己的類加載器去控制字節(jié)流的獲取方式。

加載階段完成后,虛擬機(jī)外部的二進(jìn)制字節(jié)流就按照虛擬機(jī)所需的格式存儲(chǔ)在方法區(qū)之中,方法區(qū)中的數(shù)據(jù)存儲(chǔ)格式有虛擬機(jī)實(shí)現(xiàn)自行定義,虛擬機(jī)并未規(guī)定此區(qū)域的具體數(shù)據(jù)結(jié)構(gòu)。然后在java堆中實(shí)例化一個(gè)java.lang.Class類的對(duì)象,這個(gè)對(duì)象作為程序訪問方法區(qū)中的這些類型數(shù)據(jù)的外部接口。

2.驗(yàn)證:

驗(yàn)證階段作用是保證Class文件的字節(jié)流包含的信息符合JVM規(guī)范,不會(huì)給JVM造成危害。如果驗(yàn)證失敗,就會(huì)拋出一個(gè)java.lang.VerifyError異常或其子類異常。驗(yàn)證過程分為四個(gè)階段

1.文件格式驗(yàn)證:驗(yàn)證字節(jié)流文件是否符合Class文件格式的規(guī)范,并且能被當(dāng)前虛擬機(jī)正確的處理。

2.元數(shù)據(jù)驗(yàn)證:是對(duì)字節(jié)碼描述的信息進(jìn)行語義分析,以保證其描述的信息符合Java語言的規(guī)范。

3.字節(jié)碼驗(yàn)證:主要是進(jìn)行數(shù)據(jù)流和控制流的分析,保證被校驗(yàn)類的方法在運(yùn)行時(shí)不會(huì)危害虛擬機(jī)。

4.符號(hào)引用驗(yàn)證:符號(hào)引用驗(yàn)證發(fā)生在虛擬機(jī)將符號(hào)引用轉(zhuǎn)化為直接引用的時(shí)候,這個(gè)轉(zhuǎn)化動(dòng)作將在解析階段中發(fā)生。

3.準(zhǔn)備:

準(zhǔn)備階段為變量分配內(nèi)存并設(shè)置類變量的初始化。在這個(gè)階段分配的僅為類的變量(static修飾的變量),而不包括類的實(shí)例變量。對(duì)已非final的變量,JVM會(huì)將其設(shè)置成“零值”,而不是其賦值語句的值:

pirvate static int size = 12;

那么在這個(gè)階段,size的值為0,而不是12。 final修飾的類變量將會(huì)賦值成真實(shí)的值。

4.解析:

解析階段是虛擬機(jī)常量池內(nèi)的符號(hào)引用替換為直接引用的過程。

符號(hào)引用:符號(hào)引用是一組符號(hào)來描述所引用的目標(biāo)對(duì)象,符號(hào)可以是任何形式的字面量,只要使用時(shí)能無歧義地定位到目標(biāo)即可。符號(hào)引用與虛擬機(jī)實(shí)現(xiàn)的內(nèi)存布局無關(guān),引用的目標(biāo)對(duì)象并不一定已經(jīng)加載到內(nèi)存中。

直接引用:直接引用可以是直接指向目標(biāo)對(duì)象的指針、相對(duì)偏移量或是一個(gè)能間接定位到目標(biāo)的句柄。直接引用是與虛擬機(jī)內(nèi)存布局實(shí)現(xiàn)相關(guān)的,同一個(gè)符號(hào)引用在不同虛擬機(jī)實(shí)例上翻譯出來的直接引用一般不會(huì)相同,如果有了直接引用,那引用的目標(biāo)必定已經(jīng)在內(nèi)存中存在。

虛擬機(jī)規(guī)范并沒有規(guī)定解析階段發(fā)生的具體時(shí)間,只要求了在執(zhí)行anewarry、checkcast、getfield、instanceof、invokeinterface、invokespecial、invokestatic、invokevirtual、multianewarray、new、putfield和putstatic這13個(gè)用于操作符號(hào)引用的字節(jié)碼指令之前,先對(duì)它們使用的符號(hào)引用進(jìn)行解析,所以虛擬機(jī)實(shí)現(xiàn)會(huì)根據(jù)需要來判斷,到底是在類被加載器加載時(shí)就對(duì)常量池中的符號(hào)引用進(jìn)行解析,還是等到一個(gè)符號(hào)引用將要被使用前才去解析它。

解析的動(dòng)作主要針對(duì)類或接口、字段、類方法、接口方法四類符號(hào)引用進(jìn)行。分別對(duì)應(yīng)編譯后常量池內(nèi)的CONSTANT_Class_Info、CONSTANT_Fieldref_Info、CONSTANT_Methodef_Info、CONSTANT_InterfaceMethoder_Info四種常量類型。

1.類、接口的解析

2.字段解析

3.類方法解析

4.接口方法解析

5.初始化:

類的初始化階段是類加載過程的最后一步,在準(zhǔn)備階段,類變量已賦過一次系統(tǒng)要求的初始值,而在初始化階段,則是根據(jù)程序員通過程序制定的主觀計(jì)劃去初始化類變量和其他資源,或者可以從另外一個(gè)角度來表達(dá):初始化階段是執(zhí)行類構(gòu)造器

6.使用:

新線程---程序計(jì)數(shù)器----jvm棧執(zhí)行(對(duì)象引用)-----堆內(nèi)存(直接引用)----方法區(qū)

7.卸載:

GC垃圾回收

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • 詳解Java中hashCode的作用

    詳解Java中hashCode的作用

    這篇文章主要介紹了詳解Java中hashCode的作用的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Spring Boot使用過濾器Filter過程解析

    Spring Boot使用過濾器Filter過程解析

    這篇文章主要介紹了Spring Boot使用過濾器Filter過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 詳解spring注解式參數(shù)校驗(yàn)

    詳解spring注解式參數(shù)校驗(yàn)

    本篇文章主要介紹了詳解spring注解式參數(shù)校驗(yàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實(shí)例代碼

    Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實(shí)例代碼

    本文主要介紹了Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實(shí)例代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • mybatis插件pageHelper實(shí)現(xiàn)分頁效果

    mybatis插件pageHelper實(shí)現(xiàn)分頁效果

    這篇文章主要為大家詳細(xì)介紹了mybatis插件pageHelper實(shí)現(xiàn)分頁效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Tomcat報(bào)錯(cuò):HTTP Status 500 (Wrapper cannot find servlet class)解決辦法

    Tomcat報(bào)錯(cuò):HTTP Status 500 (Wrapper cannot find servlet class)

    這篇文章主要介紹了Tomcat報(bào)錯(cuò):HTTP Status 500 (Wrapper cannot find servlet class)解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • Java數(shù)據(jù)結(jié)構(gòu)之圖的兩種搜索算法詳解

    Java數(shù)據(jù)結(jié)構(gòu)之圖的兩種搜索算法詳解

    在很多情況下,我們需要遍歷圖,得到圖的一些性質(zhì)。有關(guān)圖的搜索,最經(jīng)典的算法有深度優(yōu)先搜索和廣度優(yōu)先搜索,接下來我們分別講解這兩種搜索算法,需要的可以參考一下
    2022-11-11
  • Java怎樣判斷堆區(qū)中的對(duì)象可以被回收了

    Java怎樣判斷堆區(qū)中的對(duì)象可以被回收了

    文章介紹了Java垃圾回收機(jī)制的工作原理,主要通過引用計(jì)數(shù)法和可達(dá)性分析法來判斷對(duì)象是否可以被回收,引用計(jì)數(shù)法存在循環(huán)引用問題,而可達(dá)性分析法則使用GCRoot對(duì)象來判斷對(duì)象是否可達(dá),從而決定是否回收,這兩種方法各有優(yōu)缺點(diǎn),但Java最終采用了可達(dá)性分析法來實(shí)現(xiàn)垃圾回收
    2024-12-12
  • 用Java驗(yàn)證pdf文件的電子章簽名

    用Java驗(yàn)證pdf文件的電子章簽名

    這篇文章主要介紹了如何用Java驗(yàn)證pdf文件的電子章簽名,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • 詳解Java中方法重寫與重載的區(qū)別(面試高頻問點(diǎn))

    詳解Java中方法重寫與重載的區(qū)別(面試高頻問點(diǎn))

    這篇文章主要介紹了Java中方法重寫與重載的區(qū)別(面試高頻問點(diǎn)),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論

湛江市| 北辰区| 利川市| 通辽市| 休宁县| 达拉特旗| 同德县| 漳平市| 贺州市| 凤凰县| 奎屯市| 河源市| 枝江市| 深州市| 延安市| 汝州市| 金昌市| 老河口市| 临高县| 日喀则市| 遂昌县| 砚山县| 凤阳县| 绥化市| 盐山县| 胶州市| 扎囊县| 静乐县| 万载县| 英德市| 军事| 沾益县| 湾仔区| 恭城| 玉门市| 石景山区| 延吉市| 盐津县| 尉犁县| 乐至县| 浙江省|