網易首頁 > 網易號 > 正文 申請入駐

JVM結構--類加載

0
分享至

類加載
類加載子系統的作用


? 類加載器子系統負責從文件系統或者網絡中加載class文件,class文件在文件開頭有特定的文件標識(字節碼文件都以CA FE BA BE標識開頭)。
? ClassLoader只負責class文件的加載,至于它是否可以運行,則由Execution Engine決定。加載的類信息存放于一塊稱為 方法區 的內存空間。除了類的信息外,方法區中還會存放運行時常量池的信息,還可能包括字符串字面量和數字常量(這部分常量信息是class文件中常量池部分的內存映射)。
類加載ClassLoader的角色


class file存在于硬盤上,可以理解為設計師畫在紙上的模板,而最終這個模板在執行的時候是要加載到JVM當中來,根據這個模板實例化出n個一模一樣的實例。
class file加載到JVM中被稱為DNA元數據模板,放在方法區中。
在.class==》JVM==》最終稱為元數據模板,此過程就要有一個運輸工具(類加載器ClassLoader),扮演一個快遞員的角色。
類加載的過程


1.加載
通過類名(地址)獲取此類的二進制字節流。
將這個字節流所代表的靜態存儲結構轉換為方法區(元空間)的運行時結構。
在內存中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口。
2.鏈接
驗證:檢驗被加載的類是否有正確的內部結構,并和其他類協調一致。
準備:準備階段負責為類的靜態屬性分配內存,并設置默認初始值。
? 不包含用final修飾的static實例變量,在編譯時進行初始化。
? 不會為實例變量初始化。
解析:將類的二進制數據中的符號引用替換成直接引用(符號引用是用一組符號描述所引用的目標,直接引用是指向目標的指針)。
3.初始化
類在以下情況時會初始化:
創建類的實例,也就是new一個對象。
訪問某個類或接口的靜態變量,或者對該靜態變量賦值。
調用類的靜態方法。
反射。
初始化一個類的子類。
類的初始化順序:
如果同時包含多個靜態變量和靜態代碼塊,則按照自上而下的順序依次執行。
如果初始化一個類的時候,其父類尚未初始化,則優先初始化其父類。
順序是:父類static --> 子類static --> 父類構造方法 --> 子類構造方法
類加載器分類
JVM支持兩種類型的類加載器,分別為 引導類加載器 和 自定義類加載器。
? 從概念上講,自定義類加載器一般指的時程序匯總由開發人員自定義的一類加載器,Java虛擬機將所有派生于抽象類ClassLoader的類加載器都劃分為自定義類加載器。
常見的類加載器有3個:


引導類加載器(啟動類加載器)
使用C/C++語言實現,嵌套在JVM內部,用來加載java核心類庫。
并不集成于java.lang.ClassLoader,沒有父加載器。
負責加載擴展類加載器和應用類加載器,并為他們指定父類加載器。
出于安全考慮,引用類加載器只加載包名為java、javax、sun開頭的類。
擴展類加載器
使用java語言實現。
派生于ClassLoader類。
上層類加載器為引用類加載器。
從java.ext.dirs系統屬性所指定的目錄中加載類庫。或從JDK系統安裝目錄的jre/lib/ext子目錄(擴展目錄)下加載類庫,如果用戶創建的jar放在此目錄下,也會自動有狂戰類加載器加載。
應用程序類加載器
使用java語言實現。
派生于ClassLoader類。
上層類加載器為擴展類加載器。
用來加載我們自己定義的類。
該類加載器時程序中默認的類加載器。
通過類名.class.getClassLoader(),ClassLoader.getSystemClassLoader()來獲得。
ClassLoader是一個抽象類,其后所有的類加載器都繼承自ClassLoader(不包括啟動類加載器)。
雙親委派機制
? Java虛擬機對class文件采用的時按需加載的方式,也就是說當需要該類時才會將它的class文件加載到內存中生成class對象。而且加載某個類的class文件時,Java虛擬機采用的時雙親委派機制,即把請求交由父類處理,它是一種任務委派模式。


工作原理:
如果一個類加載器收到了類加載請求,并不會先去加載,而是把這個請求委托給父類的加載器去執行。
如果父類加載器還存在其父類加載器,則進一步向上委托,一次遞歸,請求最終將到達頂層的啟動類加載器。
如果父類加載器可以完成類的加載任務,就成功返回,倘若父類加載器無法完成加載任務,子加載器才會嘗試自己去加載,這就是雙親委派機制。
如果均加載失敗,就會拋出ClassNotFoundException異常。
**問題:**創建一個名為java.lang的包和一個名為String的類,當new String()時,會加載核心庫類中的String對象,還是自己創建的String類對象呢?
package java.lang; //此包為自己創建的java.lang
public class String{
public static void main(String[] args){
System.out.println("hello");
}
}
//這段代碼能否執行呢?(運行不了)
雙親委派機制的優點:
安全。可避免用戶自己編寫的類動態替換Java核心類,如:java.lang.String
避免全限定命名的類重復加載(使用了findLoadClass()判斷當前類是否已加載)
沙箱安全機制
作用:防止惡意代碼污染java源代碼
? 例如上面我們定義了一個名為String的類,所在包名為java.lang,因為這個類本來是屬于jdk的,如果沒有沙箱安全機制的話,這個類將會污染到系統中的String,但是由于沙箱安全機制,所以就委托頂層的引導類加載器查找到這個類,如果沒有的話就委托給擴展類加載器,再沒有就委托到系統類加載器。但是由于String就是jdk的源代碼,所以在引導類加載器那里就加載到了,先找到先使用,所以就使用引導類加載器里面的String,后面的一概不能使用,這就保證了不被惡意代碼污染。
面試題:
在JVM中如何判斷兩個對象是屬于同一個類?
答:1.類的全類名(地址)完全一致。 2.類的加載器必須相同。
類的主動使用/被動使用
JVM規定,每個類或者接口被首次主動使用時才對其進行初始化,有主動使用,自然就有被動使用。
主動使用和被動使用的區別在于類是否會被初始化。
主動使用
通過new關鍵字使類初始化,這是很常用的初始化一個類的方式,肯定會使類加載并且初始化。
訪問類的靜態變量,包括讀取和更新
訪問類的靜態方法
對某個類進行反射操作,會使類初始化
初始化子類會使其父類初始化
執行該類的main方法
被動使用
引用該類的 靜態常量 ,不會導致初始化,但是也會有意外,這里的常量是指已經指定字面量的常量,對于那些需要一些計算才能得出結果的常量就會引起類的初始化。
例如:
public final static int num=5;//不會使類初始化,被動使用
public final static int random=new Random().nextInt();//會使類初始化,主動使用
構造某個類的數組時不會導致該類的初始化
Student[] student = new Student[10];
————————————————
版權聲明:本文為CSDN博主「Gxbalun喬峰」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_45636230/article/details/115490932

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關推薦
熱點推薦
有一種痛苦叫買了“一梯一戶”,以為高大上,結果入住就后悔

有一種痛苦叫買了“一梯一戶”,以為高大上,結果入住就后悔

裝修秀
2026-04-26 10:55:03
活久見!獨居老人想喝燉瘦肉湯,一業主提出收取5元辛苦費引爭議

活久見!獨居老人想喝燉瘦肉湯,一業主提出收取5元辛苦費引爭議

火山詩話
2026-04-25 17:15:40
特朗普:妻子躲避得更快

特朗普:妻子躲避得更快

南方都市報
2026-04-26 15:03:07
伊朗最高領袖明確下令,霍爾木茲海峽突傳大消息!伊朗總統、革命衛隊發聲

伊朗最高領袖明確下令,霍爾木茲海峽突傳大消息!伊朗總統、革命衛隊發聲

每日經濟新聞
2026-04-26 14:16:05
中國需要這樣的老師!線性代數的神,全世界想學這一課程的人,都是他的學生

中國需要這樣的老師!線性代數的神,全世界想學這一課程的人,都是他的學生

爆角追蹤
2026-04-26 11:57:53
附錄:叛徒扎堆的秋收起義群像

附錄:叛徒扎堆的秋收起義群像

北山浮生
2026-04-26 13:59:22
恒鋒信息:實控人歐霖杰因涉嫌嚴重違法被留置

恒鋒信息:實控人歐霖杰因涉嫌嚴重違法被留置

界面新聞
2026-04-26 16:35:03
湖南男子買煙炫富,致使一家三口被滅,2歲兒子在遺體邊躺了兩天

湖南男子買煙炫富,致使一家三口被滅,2歲兒子在遺體邊躺了兩天

莫地方
2026-04-24 00:10:03
內塔尼亞胡:對白宮晚宴槍擊事件表示震驚,這一事件為針對特朗普的未遂刺殺事件,對美特勤局的迅速果斷行動表示敬意

內塔尼亞胡:對白宮晚宴槍擊事件表示震驚,這一事件為針對特朗普的未遂刺殺事件,對美特勤局的迅速果斷行動表示敬意

極目新聞
2026-04-26 16:35:34
男生省吃儉用送滿改鍵盤 女神轉手掛閑魚反罵"舔狗"

男生省吃儉用送滿改鍵盤 女神轉手掛閑魚反罵"舔狗"

游民星空
2026-04-26 11:10:12
37歲男籃傳奇人物:定居廣東,身居要職財富自由,娶嬌妻生雙胞胎

37歲男籃傳奇人物:定居廣東,身居要職財富自由,娶嬌妻生雙胞胎

尋墨閣
2026-04-26 01:21:55
驚魂一夜!特朗普俯身撤離,魯比奧趴到桌子底

驚魂一夜!特朗普俯身撤離,魯比奧趴到桌子底

中國新聞周刊
2026-04-26 12:35:35
前所未有!中國罕見直接表態:軍演針對菲律賓

前所未有!中國罕見直接表態:軍演針對菲律賓

鳳眼論
2026-04-24 18:49:26
中國第四艘航母官宣:是核動力!舷號19,命名大概率是“江蘇號”

中國第四艘航母官宣:是核動力!舷號19,命名大概率是“江蘇號”

福建睿平
2026-04-26 10:53:36
白宮開槍兇手是老師?網傳其剛在洛杉磯拿了“月度優秀教師”獎

白宮開槍兇手是老師?網傳其剛在洛杉磯拿了“月度優秀教師”獎

爆角追蹤
2026-04-26 12:16:15
殺1只就犯法,腳上有追蹤器,2023年四川男子捂死一只回家烹食

殺1只就犯法,腳上有追蹤器,2023年四川男子捂死一只回家烹食

萬象硬核本尊
2026-04-23 23:19:30
掘金主帥:我不喜歡麥克丹尼爾斯的行為,但這就是他的為人

掘金主帥:我不喜歡麥克丹尼爾斯的行為,但這就是他的為人

懂球帝
2026-04-26 12:45:19
這臺大眾很不大眾 解讀一汽-大眾ID. AURA T6

這臺大眾很不大眾 解讀一汽-大眾ID. AURA T6

新出行
2026-04-25 14:01:58
他們反川普已經到了靈魂撕裂、歇斯底里的程度

他們反川普已經到了靈魂撕裂、歇斯底里的程度

壹家言
2026-04-25 20:47:45
兩男子應聘浦發銀行銷售代表,通過3輪面試,做了497元體檢,工資卡都辦好了,銀行卻以學歷不符為由拒絕入職

兩男子應聘浦發銀行銷售代表,通過3輪面試,做了497元體檢,工資卡都辦好了,銀行卻以學歷不符為由拒絕入職

大象新聞
2026-04-24 16:49:09
2026-04-26 17:32:49
軟測試驗田
軟測試驗田
軟件測試領域最新最前沿資訊
117文章數 128關注度
往期回顧 全部

科技要聞

漲價浪潮下,DeepSeek推動AI“價格戰”

頭條要聞

金店電子稱旁現拇指大小遙控器 商家可遠程遙控改重量

頭條要聞

金店電子稱旁現拇指大小遙控器 商家可遠程遙控改重量

體育要聞

森林狼3比1掘金:逆境中殺出了多孫穆?!

娛樂要聞

《八千里路云和月》大結局意難平

財經要聞

DeepSeek V4背后,梁文鋒的轉身

汽車要聞

預售19.38萬元起 哈弗猛龍PLUS七座版亮相

態度原創

藝術
健康
教育
房產
時尚

藝術要聞

莆田地標太像抖音logo,網友:字節跳動,快來掛牌!

干細胞如何讓燒燙傷皮膚"再生"?

教育要聞

麻省理工公開課23:吉爾伯特教授線性代數課-微分方程和exp(At)

房產要聞

新一輪教育大爆發來了!海口,開始瘋狂建學校!

IU的臉,真的有自己的時間線

無障礙瀏覽 進入關懷版