欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JVM加載一個類的過程

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

類的加載過程

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

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

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

1.加載:

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

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

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

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

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

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

2.驗證:

驗證階段作用是保證Class文件的字節(jié)流包含的信息符合JVM規(guī)范,不會給JVM造成危害。如果驗證失敗,就會拋出一個java.lang.VerifyError異?;蚱渥宇惍惓!r炞C過程分為四個階段

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

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

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

4.符號引用驗證:符號引用驗證發(fā)生在虛擬機將符號引用轉(zhuǎn)化為直接引用的時候,這個轉(zhuǎn)化動作將在解析階段中發(fā)生。

3.準備:

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

pirvate static int size = 12;

那么在這個階段,size的值為0,而不是12。 final修飾的類變量將會賦值成真實的值。

4.解析:

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

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

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

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

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

1.類、接口的解析

2.字段解析

3.類方法解析

4.接口方法解析

5.初始化:

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

6.使用:

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

7.卸載:

GC垃圾回收

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

相關(guān)文章

  • IDEA報錯之前言中不允許有內(nèi)容問題及解決

    IDEA報錯之前言中不允許有內(nèi)容問題及解決

    當使用IntelliJ IDEA時,可能會遇到報錯信息“前言中不允許有內(nèi)容”,這通常是由于XML文件是以帶有BOM頭的UTF-8格式保存的,導致IDE的解析出錯,解決辦法是在IDEA中調(diào)整文件編碼設置為無BOM的UTF-8,然后用文本編輯器(如Notepad++)
    2024-10-10
  • java 多線程的幾種實現(xiàn)方法總結(jié)

    java 多線程的幾種實現(xiàn)方法總結(jié)

    這篇文章主要介紹了java 多線程的幾種實現(xiàn)方法總結(jié)的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握java多線程的知識,需要的朋友可以參考下
    2017-10-10
  • Java Elastic Job動態(tài)添加任務實現(xiàn)過程解析

    Java Elastic Job動態(tài)添加任務實現(xiàn)過程解析

    這篇文章主要介紹了Java Elastic Job動態(tài)添加任務實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 深入理解Java設計模式之適配器模式

    深入理解Java設計模式之適配器模式

    這篇文章主要介紹了JAVA設計模式之適配器模式的的相關(guān)資料,文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解
    2021-11-11
  • SpringBoot解決ajax跨域問題的方法

    SpringBoot解決ajax跨域問題的方法

    這篇文章主要為大家詳細介紹了SpringBoot解決ajax跨域問題的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java判斷兩個集合是否具有交集及如何獲得交集詳解

    Java判斷兩個集合是否具有交集及如何獲得交集詳解

    這篇文章主要給大家介紹了關(guān)于Java判斷兩個集合是否具有交集及如何獲得交集的相關(guān)資料,文中通過圖文以及實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • springboot如何集成mysql

    springboot如何集成mysql

    這篇文章主要介紹了springboot如何集成mysql問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • mybatis的if判斷integer問題

    mybatis的if判斷integer問題

    這篇文章主要介紹了mybatis的if判斷integer問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 詳解maven中央倉庫連不上的解決辦法

    詳解maven中央倉庫連不上的解決辦法

    這篇文章主要介紹了詳解maven中央倉庫連不上的解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 淺談在Spring中如何使用數(shù)據(jù)源(DBCP、C3P0、JNDI)

    淺談在Spring中如何使用數(shù)據(jù)源(DBCP、C3P0、JNDI)

    這篇文章主要介紹了淺談在Spring中如何使用數(shù)據(jù)源(DBCP、C3P0、JNDI),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10

最新評論