一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JVM加載一個類的過程

JVM加載一個類的過程

2020-08-05 11:29LSPZ Java教程

本文主要介紹了JVM加載一個類的過程。具有很好的參考價值,下面跟著小編一起來看下吧

加載過程

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

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

JVM加載一個類的過程

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

1.加載:

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

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

2.將這個字節流所代表的靜態存儲結構轉化為方法區域的運行時數據結構。

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

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

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

2.驗證:

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

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

2.元數據驗證:是對字節碼描述的信息進行語義分析,以保證其描述的信息符合Java語言的規范。

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

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

3.準備:

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

pirvate static int size = 12;

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

4.解析:

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

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

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

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

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

1.類、接口的解析

2.字段解析

3.類方法解析

4.接口方法解析

5.初始化:

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

6.使用:

新線程---程序計數器----jvm棧執行(對象引用)-----堆內存(直接引用)----方法區

7.卸載:

GC垃圾回收

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

原文鏈接:http://www.cnblogs.com/lspz/p/6381202.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 婷婷精品 | 免费观看毛片视频 | 日本韩国一区二区三区 | 欧美一区二区三区久久久 | 国产aⅴ一区二区三区 | xxxxxx国产精品视频 | 免费观看美女被cao视频 | 69老司机亚洲精品一区 | 国产乱子伦一区二区三区 | 456成人免费高清视频 | 四虎一影院区永久精品 | 久久九九亚洲精品 | 日本免费v片一二三区 | 99国产精品久久久久久久... | 国产精品久久久久久久福利院 | 青青草高清视频 | 亚洲国产剧情中文视频在线 | 国产精品理论片在线观看 | 狠狠的撞进去嗯啊h女强男视频 | 俄罗斯bbbbbbxxxxxx| 给我一个黄色网址 | 精品国产免费第一区二区 | 99久久精品国内 | 亚洲激情成人 | 成人永久免费视频 | 国产精品视频在这里有精品 | 福利片福利一区二区三区 | 亚洲精品永久免费 | 国产精品美女福利视频免费专区 | 亚洲国产区中文在线观看 | 亚洲AV蜜桃永久无码精品无码网 | 8x8x丝袜美女 | bl双性肉文 | 女教师三级做受 | 91精品久久 | 精品91自产拍在线观看99re | 西野翔全部作品在线观看 | 精品久久成人免费第三区 | 亚洲成人国产 | 日韩欧美推理片免费在线播放 | 色先锋影音资源 |