日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java—JVM加载机制

發(fā)布時(shí)間:2023/12/18 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java—JVM加载机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

編程語(yǔ)言有兩種:

1、編譯型語(yǔ)言? ? ? ? 將代碼一次性編譯成計(jì)算機(jī)可識(shí)別的二進(jìn)制文件,語(yǔ)言有C和C++

2、解釋型語(yǔ)言? ? ? ? 通過(guò)解釋器,一行行讀取我們編寫(xiě)的代碼轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)后執(zhí)行,JVM就是解釋器,語(yǔ)言有java和kotlin lei

類加載器:

1.啟動(dòng)類加載器(Bootstrap ClassLoader):加載JVM自身工作需要的類,它由JVM自己實(shí)現(xiàn)。它會(huì)加載JAVA_HOME/jre/lib下的文件。

2.擴(kuò)展類加載器(Extension ClassLoader):負(fù)責(zé)加載JVM擴(kuò)展類,jvm里面lib目錄中的ext中的jar包

3.應(yīng)用程序類加載器(Application ClassLoader):根據(jù)ClassPath指定路徑,尋找應(yīng)用程序所有加載class字節(jié)碼文件,從字節(jié)碼文件中加載類型對(duì)應(yīng)的class對(duì)象,我們自己編寫(xiě)的代碼以及使用的第三方的jar包都是由它來(lái)加載。

一個(gè)類,由不同的類加載器實(shí)例加載的話,會(huì)在方法區(qū)產(chǎn)生兩個(gè)不同的類,彼此不可見(jiàn),并且在堆中生成不同Class實(shí)例。

雙親委托模型

如果一個(gè)類加載器收到了類加載請(qǐng)求,它并不會(huì)自己先去加載,而是把這個(gè)請(qǐng)求委托給父類的加載器去執(zhí)行。

如果父類加載器還存在其父類加載器,則進(jìn)一步向上委托,依次遞歸,請(qǐng)求最終將到達(dá)頂層的啟動(dòng)類加載器,如果父類加載器可以完成類加載任務(wù),就成功返回,倘若父類加載器無(wú)法完成此加載任務(wù),子加載器才會(huì)嘗試自己去加載,這就是雙親委派模式

優(yōu)點(diǎn):避免類的重復(fù)加載,避免了java的核心API被篡改。

類的生命周期:

一、類的加載

在加載的時(shí)候,虛擬機(jī)將我們寫(xiě)的.java文件,編譯成字節(jié)碼后加載到內(nèi)存里,然后在內(nèi)存中生成一個(gè)java.lang.Class對(duì)象,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)的訪問(wèn)入口。

二、類的連接

類的加載過(guò)程后生成了類的java.lang.Class對(duì)象,接著會(huì)進(jìn)入連接階段,連接階段負(fù)責(zé)將類的二進(jìn)制數(shù)據(jù)合并入JRE(Java運(yùn)行時(shí)環(huán)境)中。類的連接大致分三個(gè)階段。

1、驗(yàn)證:驗(yàn)證此class字節(jié)流是安全的、沒(méi)有被修改的、可以被正常使用的.

2、準(zhǔn)備:為類的靜態(tài)變量(static)在方法區(qū)分配內(nèi)存,并賦默認(rèn)初值(0值或null值)。

? ? ? ? ? ? ? ? 如static int a = 5;? ? ?靜態(tài)變量a被賦默認(rèn)值0。

? ? ? ? ? ? ? ??靜態(tài)常量(static final)會(huì)被賦程序設(shè)定的初值。

? ? ? ? ? ? ? ? 如static final int a = 5; ?靜態(tài)常量a就會(huì)在準(zhǔn)備階段被直接賦值為5,而靜態(tài)變量是在初始化階段進(jìn)行的。

? ? ? ? ? ? ? ? 對(duì)于一般的成員變量是在類實(shí)例化時(shí)候,隨對(duì)象一起分配在堆內(nèi)存中。

3、解析:JVM將常量池中的符號(hào)引用轉(zhuǎn)換成直接引用的過(guò)程。

三、類的初始化

類初始化是類加載的最后一步,除了加載階段,用戶可以通過(guò)自定義的類加載器參與,其他階段都完全由虛擬機(jī)主導(dǎo)和控制。到了初始化階段才真正執(zhí)行Java代碼。

類的初始化的主要工作是為靜態(tài)變量賦程序設(shè)定的初值。

如static int a = 100;在準(zhǔn)備階段,a被賦默認(rèn)值0,在初始化階段就j會(huì)被賦值為100。

java虛擬機(jī)規(guī)范中嚴(yán)格規(guī)定了有且只有五種情況必須對(duì)類進(jìn)行初始化:

1、使用new字節(jié)碼指令創(chuàng)建類的實(shí)例,或者使用getstatic、putstatic讀取或設(shè)置一個(gè)靜態(tài)字段的值(放入常量池中的常量除外),或者調(diào)用一個(gè)靜態(tài)方法的時(shí)候,對(duì)應(yīng)類必須進(jìn)行過(guò)初始化。

2、通過(guò)java.lang.reflect包的方法對(duì)類進(jìn)行反射調(diào)用的時(shí)候,如果類沒(méi)有進(jìn)行過(guò)初始化,則要首先進(jìn)行初始化。

3、當(dāng)初始化一個(gè)類的時(shí)候,如果發(fā)現(xiàn)其父類沒(méi)有進(jìn)行過(guò)初始化,則首先觸發(fā)父類初始化。

4、當(dāng)虛擬機(jī)啟動(dòng)時(shí),用戶需要指定一個(gè)主類(包含main()方法的類),虛擬機(jī)會(huì)首先初始化這個(gè)類。

5、使用jdk1.7的動(dòng)態(tài)語(yǔ)言支持時(shí),如果一個(gè)java.lang.invoke.MethodHandle實(shí)例最后的解析結(jié)果REF_getStatic、REF_putStatic、RE_invokeStatic的方法句柄,并且這個(gè)方法句柄對(duì)應(yīng)的類沒(méi)有進(jìn)行初始化,則需要先觸發(fā)其初始化。

總結(jié)

以上是生活随笔為你收集整理的Java—JVM加载机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。