自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

類是如何加載的?你學(xué)會了嗎?

開發(fā) 前端
初始化階段,Java 虛擬機(jī)真正開始執(zhí)行類中編寫的 Java 程序代碼,將主導(dǎo)權(quán)移交給應(yīng)用程序。到這一步驟之后,類的加載過程就算正式完成了,此時(shí)會給靜態(tài)變量設(shè)置初始值,并執(zhí)行靜態(tài)代碼塊的內(nèi)容。

在 Java 中,類加載的流程有一個(gè)專門的機(jī)制叫做“類加載機(jī)制”。類加載機(jī)制是指一個(gè)類在 Java 虛擬機(jī)(JVM)中的執(zhí)行流程,它也是 Java 程序能夠正常執(zhí)行的關(guān)鍵所在,那它的具體執(zhí)行流程是啥?接下來我們一起來看。

流程概述

在 JVM 中,類加載會經(jīng)歷以下 5 個(gè)階段:

  1. 加載階段(Loading)
  2. 驗(yàn)證階段(Verification)
  3. 準(zhǔn)備階段(Preparation)
  4. 解析階段(Resolution)
  5. 初始化階段(Initialization)

其中:驗(yàn)證階段、準(zhǔn)備階段和解析階段合起來又稱為連接階段,所以以上 5 個(gè)階段又可以劃分為 3 大類:

  1. 加載階段(Loading)
  2. 連接階段(Linking)
  1. 驗(yàn)證階段(Verification)
  2. 準(zhǔn)備階段(Preparation)
  3. 解析階段(Resolution)
  1. 初始化階段(Initialization)

具體分類如下圖所示:

圖片

這 3 大類、5 個(gè)流程的具體執(zhí)行細(xì)節(jié)是這樣的。

1.加載階段

簡單來說,加載階段就是將類文件加載到內(nèi)存中的過程。在加載階段,JVM 需要完成以下 3 件事:

  1. 通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流;
  2. 將這個(gè)字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu);
  3. 在內(nèi)存中生成一個(gè)代表這個(gè)類的 java.lang.Class 對象,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)的訪問入口。

2.連接階段

連接階段又分為:驗(yàn)證階段(Verification)、準(zhǔn)備階段(Preparation)和解析階段(Resolution),具體執(zhí)行的細(xì)節(jié)如下。

2.1 驗(yàn)證階段

驗(yàn)證階段也叫做校驗(yàn)階段,它主要是用來驗(yàn)證加載到內(nèi)存中的類是否是安全合規(guī)的文件,驗(yàn)證的主要動作大概有以下幾個(gè)(當(dāng)然,以下細(xì)節(jié)如果實(shí)在記不住也沒關(guān)系):

  • 文件格式校驗(yàn)包括常量池中的常量類型、Class 文件的各個(gè)部分是否被刪除或被追加了其他信息等;
  • 元數(shù)據(jù)校驗(yàn)包括父類正確性校驗(yàn)(檢查父類是否有被 final 修飾)、抽象類校驗(yàn)等;
  • 字節(jié)碼校驗(yàn),此步驟最為關(guān)鍵和復(fù)雜,主要用于校驗(yàn)程序中的語義是否合法且符合邏輯;
  • 符號引用校驗(yàn),對類自身以外比如常量池中的各種符號引用的信息進(jìn)行匹配性校驗(yàn)。

2.2 準(zhǔn)備階段

準(zhǔn)備階段就開始給類中的靜態(tài)變量設(shè)置默認(rèn)值了,注意這里不是給靜態(tài)變量設(shè)置初始值,而是設(shè)置默認(rèn)值,二者還是有很大區(qū)別的。舉個(gè)例子,比如代碼中寫的內(nèi)容是:

public static int number = 10;

那么此時(shí)是給 number 變量設(shè)置的 int 值是默認(rèn)值 0,而非初始值 10。

2.3 解析階段

解析階段就是將常量池中的符號引用更換成直接引用了,所謂的符號引用是指以一組符號來描述所引用的目標(biāo),符號可以是任何形式的字面量,只要使用時(shí)能無歧義地定位到目標(biāo)即可;而直接引用是可以直接指向目標(biāo)的指針、相對偏移量或者是一個(gè)能間接定位到目標(biāo)的句柄。符號引用和直接引用有一個(gè)重要的區(qū)別:使用符號引用時(shí)被引用的目標(biāo)不一定已經(jīng)加載到內(nèi)存中;而使用直接引用時(shí),引用的目標(biāo)必定已經(jīng)存在虛擬機(jī)的內(nèi)存中了。

3.初始化階段

初始化階段,Java 虛擬機(jī)真正開始執(zhí)行類中編寫的 Java 程序代碼,將主導(dǎo)權(quán)移交給應(yīng)用程序。到這一步驟之后,類的加載過程就算正式完成了,此時(shí)會給靜態(tài)變量設(shè)置初始值,并執(zhí)行靜態(tài)代碼塊的內(nèi)容。

總結(jié)

類加載流程總共分為 3 大類,5 個(gè)主要流程:

  1. 加載階段(Loading):將類文件加載到內(nèi)存。
  2. 連接階段(Linking)
  1. 驗(yàn)證階段(Verification):類文件安全性效驗(yàn)。
  2. 準(zhǔn)備階段(Preparation):給靜態(tài)變量設(shè)置默認(rèn)值。
  3. 解析階段(Resolution):將符號引用轉(zhuǎn)換為直接引用。
  1. 初始化階段(Initialization):執(zhí)行靜態(tài)代碼塊和給靜態(tài)變量設(shè)置初始值。


責(zé)任編輯:武曉燕 來源: Java面試真題解析
相關(guān)推薦

2023-03-17 16:44:44

Channel進(jìn)程模型

2024-08-09 08:17:07

SSH服務(wù)器架構(gòu)

2023-06-15 14:10:00

kubeletCNI插件

2022-08-08 08:17:43

類隔離加載器自定義類

2023-12-11 08:03:01

Java線程線程組

2023-10-06 00:01:08

UML類圖圖形

2024-11-29 08:53:46

2023-12-27 09:32:47

SQL語句數(shù)據(jù)

2024-11-28 10:32:32

2024-02-02 11:03:11

React數(shù)據(jù)Ref

2022-11-30 09:54:57

網(wǎng)絡(luò)令牌身份驗(yàn)證

2022-07-08 09:27:48

CSSIFC模型

2024-01-02 12:05:26

Java并發(fā)編程

2023-08-01 12:51:18

WebGPT機(jī)器學(xué)習(xí)模型

2023-01-10 08:43:15

定義DDD架構(gòu)

2024-02-04 00:00:00

Effect數(shù)據(jù)組件

2023-07-26 13:11:21

ChatGPT平臺工具

2024-01-19 08:25:38

死鎖Java通信

2024-03-11 08:27:43

前端圖片格式

2023-04-27 08:42:50

效果
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號