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

JVM類加載過程最全詳解(五大過程圖解)

開發(fā) 前端
在加載階段,JVM會查找并加載類的字節(jié)碼文件,這個過程通常從類路徑(Classpath)中查找類文件,然后將它們讀入內(nèi)存。

JVM類加載

整個過程如下圖所示:

圖片圖片

加載

加載階段是類加載的第一步,它的主要任務(wù)是找到并加載類的字節(jié)碼文件。

在加載階段,JVM會查找并加載類的字節(jié)碼文件,這個過程通常從類路徑(Classpath)中查找類文件,然后將它們讀入內(nèi)存。

如下圖所示:

圖片圖片

JVM通過類加載器(ClassLoader)從類路徑(Classpath)中查找類文件。

加載后的類字節(jié)碼被存儲在方法區(qū)(在JVM規(guī)范中被稱為Metaspace)中,并為每個類創(chuàng)建一個Class對象。

驗證

一旦類被加載到內(nèi)存中,JVM會對字節(jié)碼文件進行驗證,以確保其完整性和合法性。

如下圖所示:

圖片圖片

這包括檢查字節(jié)碼文件的結(jié)構(gòu),以防止惡意代碼或錯誤的字節(jié)碼文件,確保加載的類符合JVM規(guī)范,不會危害JVM的安全。

驗證主要分為3個步驟:

1.文件格式驗證

在這個階段,JVM首先檢查字節(jié)碼文件的格式是否合法。

這包括檢查文件頭是否以魔數(shù)開頭(通常為0xCAFEBABE),以及文件版本號是否合適。

2.語義驗證 在這個階段

JVM會對字節(jié)碼進行語義分析,確保代碼中不會存在語法錯誤和語義錯誤。

3.字節(jié)碼驗證 在這個階段

字節(jié)碼驗證是最復雜的一步,它檢查字節(jié)碼是否符合Java語言規(guī)范。

這包括驗證操作碼是否合法,跳轉(zhuǎn)指令是否正確,以及棧操作是否匹配。

如果字節(jié)碼驗證失敗,JVM會認為這個類是不安全的,并拒絕加載它。

準備

Java虛擬機的類準備階段是類加載過程的重要步驟之一,它負責為類的靜態(tài)變量分配內(nèi)存并初始化這些變量。

如下圖所示:

圖片圖片

準備階段為類的靜態(tài)變量分配內(nèi)存,并初始化這些變量為默認值(通常為零值,例如0或null)。

例如,對于以下代碼:

public class MyClass {
    public static int x = 10;
}

在準備階段,x 的值將被初始化為 10。

解析

解析階段的主要任務(wù):是將類或接口中的符號引用轉(zhuǎn)化為直接引用。

如下圖所示:

圖片圖片

解析過程包括以下步驟:

a. 根據(jù)符號引用的類名找到對應(yīng)的類。

b. 驗證類的可訪問性和繼承關(guān)系,確保訪問不會違反訪問控制規(guī)則。

c. 找到符號引用對應(yīng)的字段或方法,獲取其內(nèi)存地址或偏移量。

d. 最終將符號引用替換為直接引用,以便在運行時直接訪問類、字段或方法。

初始化

初始化階段是類加載的最后一步,它負責執(zhí)行類的初始化代碼。

在初始化階段,靜態(tài)代碼塊會被執(zhí)行,靜態(tài)變量會被賦予初始值。

如下圖所示:

圖片圖片

在初始化階段中,JVM會執(zhí)行以下操作:

1.為類的靜態(tài)變量分配內(nèi)存,并設(shè)置初始值

在加載階段中,JVM會為類的靜態(tài)變量分配內(nèi)存,并設(shè)置默認初始值。

2.執(zhí)行類的靜態(tài)代碼塊

在初始化階段中,JVM會執(zhí)行類的靜態(tài)代碼塊,這些靜態(tài)代碼塊中可以包含任意的Java代碼。

總之:JVM的類加載過程包括加載、驗證、準備、解析和初始化五個階段,確保類在被使用之前被正確加載和初始化。

責任編輯:武曉燕 來源: mikechen的互聯(lián)網(wǎng)架構(gòu)
相關(guān)推薦

2012-03-01 10:51:37

JavaJVM

2019-07-24 08:34:35

Java對象數(shù)據(jù)結(jié)構(gòu)

2020-10-19 09:09:46

Class文件加載過程

2022-01-14 11:45:40

JVM 虛擬機Java

2021-01-29 06:06:12

JDK15類加載Java

2010-09-16 15:24:16

JVM結(jié)構(gòu)

2010-01-06 15:26:14

JSON語法

2011-03-16 10:19:21

瀏覽器性能測試

2010-06-12 16:42:03

UML設(shè)計

2010-10-08 14:04:10

JavaScript網(wǎng)

2024-10-21 16:34:15

2024-09-05 08:28:25

2023-08-02 08:38:27

JVM加載機制

2011-06-22 10:14:49

JVM

2012-11-06 10:19:18

Java自定義加載Java類

2015-08-05 15:42:10

程序員面試問題

2024-03-28 12:32:18

JVM類加載構(gòu)造器

2012-12-18 10:09:26

虛擬化應(yīng)用錯誤

2011-04-07 14:12:04

Firefox 5.0

2019-06-04 10:40:07

點贊
收藏

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