欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)激活碼778899分享:【JVM】類加載機(jī)制

柚子快報(bào)激活碼778899分享:【JVM】類加載機(jī)制

http://yzkb.51969.com/

文章目錄

類加載機(jī)制類加載過程1. 加載2. 驗(yàn)證3. 準(zhǔn)備4. 解析偏移量符號(hào)引用和直接引用

5. 初始化

類加載機(jī)制

類加載指的是,Java 進(jìn)程運(yùn)行的時(shí)候,需要把 .class 文件從硬盤讀取到內(nèi)存,并進(jìn)行一些列的校驗(yàn)解析的過程(程序要想執(zhí)行,就得進(jìn)入內(nèi)存)

.class 文件==>類對(duì)象硬盤==>內(nèi)存

類加載過程

類加載的過程,其實(shí)是在 Java 官方文檔中給出的說明

加載:找到. class 文件,并且讀文件內(nèi)容驗(yàn)證:校驗(yàn) .class 文件的格式是否符合 JVM 規(guī)范要求準(zhǔn)備:給類對(duì)象分配內(nèi)存(此時(shí)內(nèi)存空間全是 0 的==>類的靜態(tài)成員也就是全 0 的值)解析:針對(duì)類中的字符串常量進(jìn)行處理把類對(duì)象的各個(gè)屬性進(jìn)行賦值填充==>觸發(fā)對(duì)父類的加載,初始化靜態(tài)成員,執(zhí)行靜態(tài)代碼塊

類加載大體的過程可以分為五 個(gè)步驟(也有資料上說是三個(gè),這個(gè)情況就是把 2,3,4 合并成一個(gè)了)

1. 加載

把硬盤上的 .class 文件找到,打開文件,讀取到文件內(nèi)容(認(rèn)為讀到的是二進(jìn)制的數(shù)據(jù))

找文件這里還有點(diǎn)幺蛾子(后面再說)

2. 驗(yàn)證

當(dāng)前需要確保讀到的文件的內(nèi)容是合法的 .class 文件(字節(jié)碼文件)格式

具體的驗(yàn)證依據(jù),在 Java 虛擬機(jī)規(guī)范中,有明確的格式說明: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html

這里的描述方式,類似與 C語言的結(jié)構(gòu)體

前面一列是屬性的類型;后面一列是屬性的名字u4 就是 4 個(gè)字節(jié)的無符號(hào)整數(shù)

magic

magic 也叫做 magic number,魔幻數(shù)字。廣泛應(yīng)用于二進(jìn)制文件格式中,用來標(biāo)識(shí)當(dāng)前二進(jìn)制文件的格式是哪種類型

二進(jìn)制文件是一個(gè)非常廣泛的話題。mp3、mp4 是二進(jìn)制,你圖片也是二進(jìn)制,你一個(gè)可執(zhí)行程序也是二進(jìn)制,你一個(gè) .class 文件也是二進(jìn)制。不同的二進(jìn)制,在使用和解析的時(shí)候肯定是存在一些差別的

所以我們一般就會(huì)在二進(jìn)制文件開頭指定一個(gè)固定的“魔幻數(shù)字”,通過這個(gè)數(shù)字對(duì)這個(gè)文件類型進(jìn)行區(qū)分

minor/major_version

minor_version:次版本major_version:主版本

平時(shí)說 Java 8,9,17… 平時(shí)表達(dá)的時(shí)候使用的版本,實(shí)際上 JVM 開發(fā)過程中內(nèi)部還有版本(通過 minor/major_version 進(jìn)行表示)

JVM 執(zhí)行 .class 文件對(duì)的時(shí)候,就會(huì)驗(yàn)證版本是否符合要求。如果版本不兼容,就無法執(zhí)行。一般來說,高版本的 JVM 可以運(yùn)行低版本的 .class,反之不一定能行

3. 準(zhǔn)備

給類對(duì)象申請(qǐng)內(nèi)存空間

此時(shí)申請(qǐng)到的內(nèi)存空間,里面的默認(rèn)值,都是全 0 的。(這個(gè)階段中,類對(duì)象里的靜態(tài)成員變量的值也就相當(dāng)于是 0)

4. 解析

主要是針對(duì)類中的字符串常量進(jìn)行處理

解析階段是 Java 虛擬機(jī)將常量池的符號(hào)引用替換為直接引用的過程,也就是初始化常量的過程

偏移量

class Test {

private String s = "hello";

}

在 .class 文件中,會(huì)有一個(gè)部分用來存儲(chǔ)“hello”這個(gè)字符串常量(常量池里面,上面驗(yàn)證的格式里面包含了)還有一個(gè)空間對(duì)應(yīng)著 s 這個(gè)變量

在上述代碼中,我們很明顯的知道,s 變量里面相當(dāng)于保存了“hello”字符串常量的地址。但是在文件中,不存在“地址”這樣的概念。談到地址就是“內(nèi)存”的地址,我們是文件,是硬盤(硬盤沒有地址的概念)雖然沒有地址,但是可以存儲(chǔ)一個(gè)類似于地址的“偏移量”(文件開頭到“hello”的距離)這樣的概念,用來描述這個(gè)數(shù)據(jù)的位置

符號(hào)引用和直接引用

此處文件中填充給 s 的“hello”的偏移量,就可以認(rèn)為是“符號(hào)引用”。接下來要把 .class 文件加載到內(nèi)存中,就會(huì)先把“hello”這個(gè)字符串加載到內(nèi)存中,此時(shí)“hello”就有地址了。

之后 s 里面的值就可以替換成當(dāng)前“hello”真實(shí)的地址了(直接引用)

本來在文件中存儲(chǔ)的并非是一個(gè)真實(shí)的地址,而是一個(gè)標(biāo)記(偏移量);我們回到內(nèi)存中后,我們就可以把這個(gè)數(shù)據(jù)的存儲(chǔ)換成真實(shí)的地址了

5. 初始化

針對(duì)類對(duì)象完成后續(xù)的初始化 還要執(zhí)行靜態(tài)代碼塊的邏輯,還可能會(huì)觸發(fā)父類的加載

柚子快報(bào)激活碼778899分享:【JVM】類加載機(jī)制

http://yzkb.51969.com/

文章來源

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19497213.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄