日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

jvm之java類加載機(jī)制和類加載器(ClassLoader)的用法

瀏覽:27日期:2022-08-25 09:39:38

當(dāng)程序主動使用某個類時,如果該類還未被加載到內(nèi)存中,則JVM會通過加載、連接、初始化3個步驟來對該類進(jìn)行初始化。如果沒有意外,JVM將會連續(xù)完成3個步驟,所以有時也把這個3個步驟統(tǒng)稱為類加載或類初始化。

jvm之java類加載機(jī)制和類加載器(ClassLoader)的用法

一、類加載過程

1.加載

加載指的是將類的class文件讀入到內(nèi)存,并為之創(chuàng)建一個java.lang.Class對象,也就是說,當(dāng)程序中使用任何類時,系統(tǒng)都會為之建立一個java.lang.Class對象。

類的加載由類加載器完成,類加載器通常由JVM提供,這些類加載器也是前面所有程序運(yùn)行的基礎(chǔ),JVM提供的這些類加載器通常被稱為系統(tǒng)類加載器。除此之外,開發(fā)者可以通過繼承ClassLoader基類來創(chuàng)建自己的類加載器。

通過使用不同的類加載器,可以從不同來源加載類的二進(jìn)制數(shù)據(jù),通常有如下幾種來源。

從本地文件系統(tǒng)加載class文件,這是前面絕大部分示例程序的類加載方式。

從JAR包加載class文件,這種方式也是很常見的,前面介紹JDBC編程時用到的數(shù)據(jù)庫驅(qū)動類就放在JAR文件中,JVM可以從JAR文件中直接加載該class文件。

通過網(wǎng)絡(luò)加載class文件。

把一個Java源文件動態(tài)編譯,并執(zhí)行加載。

類加載器通常無須等到“首次使用”該類時才加載該類,Java虛擬機(jī)規(guī)范允許系統(tǒng)預(yù)先加載某些類。

2.鏈接

當(dāng)類被加載之后,系統(tǒng)為之生成一個對應(yīng)的Class對象,接著將會進(jìn)入連接階段,連接階段負(fù)責(zé)把類的二進(jìn)制數(shù)據(jù)合并到JRE中。類連接又可分為如下3個階段。

1)驗證:驗證階段用于檢驗被加載的類是否有正確的內(nèi)部結(jié)構(gòu),并和其他類協(xié)調(diào)一致。Java是相對C++語言是安全的語言,例如它有C++不具有的數(shù)組越界的檢查。這本身就是對自身安全的一種保護(hù)。驗證階段是Java非常重要的一個階段,它會直接的保證應(yīng)用是否會被惡意入侵的一道重要的防線,越是嚴(yán)謹(jǐn)?shù)尿炞C機(jī)制越安全。驗證的目的在于確保Class文件的字節(jié)流中包含信息符合當(dāng)前虛擬機(jī)要求,不會危害虛擬機(jī)自身安全。其主要包括四種驗證,文件格式驗證,元數(shù)據(jù)驗證,字節(jié)碼驗證,符號引用驗證。

四種驗證做進(jìn)一步說明:

文件格式驗證:主要驗證字節(jié)流是否符合Class文件格式規(guī)范,并且能被當(dāng)前的虛擬機(jī)加載處理。例如:主,次版本號是否在當(dāng)前虛擬機(jī)處理的范圍之內(nèi)。常量池中是否有不被支持的常量類型。指向常量的中的索引值是否存在不存在的常量或不符合類型的常量。

元數(shù)據(jù)驗證:對字節(jié)碼描述的信息進(jìn)行語義的分析,分析是否符合java的語言語法的規(guī)范。

字節(jié)碼驗證:最重要的驗證環(huán)節(jié),分析數(shù)據(jù)流和控制,確定語義是合法的,符合邏輯的。主要的針對元數(shù)據(jù)驗證后對方法體的驗證。保證類方法在運(yùn)行時不會有危害出現(xiàn)。

符號引用驗證:主要是針對符號引用轉(zhuǎn)換為直接引用的時候,是會延伸到第三解析階段,主要去確定訪問類型等涉及到引用的情況,主要是要保證引用一定會被訪問到,不會出現(xiàn)類等無法訪問的問題。

2)準(zhǔn)備:類準(zhǔn)備階段負(fù)責(zé)為類的靜態(tài)變量分配內(nèi)存,并設(shè)置默認(rèn)初始值。

3)解析:將類的二進(jìn)制數(shù)據(jù)中的符號引用替換成直接引用。說明一下:符號引用:符號引用是以一組符號來描述所引用的目標(biāo),符號可以是任何的字面形式的字面量,只要不會出現(xiàn)沖突能夠定位到就行。布局和內(nèi)存無關(guān)。直接引用:是指向目標(biāo)的指針,偏移量或者能夠直接定位的句柄。該引用是和內(nèi)存中的布局有關(guān)的,并且一定加載進(jìn)來的。

3.初始化

初始化是為類的靜態(tài)變量賦予正確的初始值,準(zhǔn)備階段和初始化階段看似有點(diǎn)矛盾,其實(shí)是不矛盾的,如果類中有語句:private static int a = 10,它的執(zhí)行過程是這樣的,首先字節(jié)碼文件被加載到內(nèi)存后,先進(jìn)行鏈接的驗證這一步驟,驗證通過后準(zhǔn)備階段,給a分配內(nèi)存,因為變量a是static的,所以此時a等于int類型的默認(rèn)初始值0,即a=0,然后到解析(后面在說),到初始化這一步驟時,才把a(bǔ)的真正的值10賦給a,此時a=10。

二、類加載時機(jī)

創(chuàng)建類的實(shí)例,也就是new一個對象

訪問某個類或接口的靜態(tài)變量,或者對該靜態(tài)變量賦值

調(diào)用類的靜態(tài)方法

反射(Class.forName('com.lyj.load'))

初始化一個類的子類(會首先初始化子類的父類)

JVM啟動時標(biāo)明的啟動類,即文件名和類名相同的那個類

除此之外,下面幾種情形需要特別指出:

對于一個final類型的靜態(tài)變量,如果該變量的值在編譯時就可以確定下來,那么這個變量相當(dāng)于“宏變量”。Java編譯器會在編譯時直接把這個變量出現(xiàn)的地方替換成它的值,因此即使程序使用該靜態(tài)變量,也不會導(dǎo)致該類的初始化。反之,如果final類型的靜態(tài)Field的值不能在編譯時確定下來,則必須等到運(yùn)行時才可以確定該變量的值,如果通過該類來訪問它的靜態(tài)變量,則會導(dǎo)致該類被初始化。

三、類加載器

類加載器負(fù)責(zé)加載所有的類,其為所有被載入內(nèi)存中的類生成一個java.lang.Class實(shí)例對象。一旦一個類被加載如JVM中,同一個類就不會被再次載入了。正如一個對象有一個唯一的標(biāo)識一樣,一個載入JVM的類也有一個唯一的標(biāo)識。在Java中,一個類用其全限定類名(包括包名和類名)作為標(biāo)識;但在JVM中,一個類用其全限定類名和其類加載器作為其唯一標(biāo)識。例如,如果在pg的包中有一個名為Person的類,被類加載器ClassLoader的實(shí)例kl負(fù)責(zé)加載,則該P(yáng)erson類對應(yīng)的Class對象在JVM中表示為(Person.pg.kl)。這意味著兩個類加載器加載的同名類:(Person.pg.kl)和(Person.pg.kl2)是不同的、它們所加載的類也是完全不同、互不兼容的。

JVM預(yù)定義有三種類加載器,當(dāng)一個 JVM啟動的時候,Java開始使用如下三種類加載器:

1)根類加載器(bootstrap class loader):它用來加載 Java 的核心類,是用原生代碼來實(shí)現(xiàn)的,并不繼承自 java.lang.ClassLoader(負(fù)責(zé)加載$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++實(shí)現(xiàn),不是ClassLoader子類)。由于引導(dǎo)類加載器涉及到虛擬機(jī)本地實(shí)現(xiàn)細(xì)節(jié),開發(fā)者無法直接獲取到啟動類加載器的引用,所以不允許直接通過引用進(jìn)行操作。

下面程序可以獲得根類加載器所加載的核心類庫,并會看到本機(jī)安裝的Java環(huán)境變量指定的jdk中提供的核心jar包路徑:

public class ClassLoaderTest { public static void main(String[] args) { URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs(); for(URL url : urls){ System.out.println(url.toExternalForm()); } }}

運(yùn)行結(jié)果:

jvm之java類加載機(jī)制和類加載器(ClassLoader)的用法

2)擴(kuò)展類加載器(extensions class loader):它負(fù)責(zé)加載JRE的擴(kuò)展目錄,lib/ext或者由java.ext.dirs系統(tǒng)屬性指定的目錄中的JAR包的類。由Java語言實(shí)現(xiàn),父類加載器為null。

3)系統(tǒng)類加載器(system class loader):被稱為系統(tǒng)(也稱為應(yīng)用)類加載器,它負(fù)責(zé)在JVM啟動時加載來自Java命令的-classpath選項、java.class.path系統(tǒng)屬性,或者CLASSPATH換將變量所指定的JAR包和類路徑。程序可以通過ClassLoader的靜態(tài)方法getSystemClassLoader()來獲取系統(tǒng)類加載器。如果沒有特別指定,則用戶自定義的類加載器都以此類加載器作為父加載器。由Java語言實(shí)現(xiàn),父類加載器為ExtClassLoader。

類加載器加載Class大致要經(jīng)過如下8個步驟:

檢測此Class是否載入過,即在緩沖區(qū)中是否有此Class,如果有直接進(jìn)入第8步,否則進(jìn)入第2步。

如果沒有父類加載器,則要么Parent是根類加載器,要么本身就是根類加載器,則跳到第4步,如果父類加載器存在,則進(jìn)入第3步。

請求使用父類加載器去載入目標(biāo)類,如果載入成功則跳至第8步,否則接著執(zhí)行第5步。

請求使用根類加載器去載入目標(biāo)類,如果載入成功則跳至第8步,否則跳至第7步。

當(dāng)前類加載器嘗試尋找Class文件,如果找到則執(zhí)行第6步,如果找不到則執(zhí)行第7步。

從文件中載入Class,成功后跳至第8步。

拋出ClassNotFountException異常。

返回對應(yīng)的java.lang.Class對象。

四、類加載機(jī)制:

1.JVM的類加載機(jī)制主要有如下3種。

全盤負(fù)責(zé):所謂全盤負(fù)責(zé),就是當(dāng)一個類加載器負(fù)責(zé)加載某個Class時,該Class所依賴和引用其他Class也將由該類加載器負(fù)責(zé)載入,除非顯示使用另外一個類加載器來載入。

雙親委派:所謂的雙親委派,則是先讓父類加載器試圖加載該Class,只有在父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類。通俗的講,就是某個特定的類加載器在接到加載類的請求時,首先將加載任務(wù)委托給父加載器,依次遞歸,如果父加載器可以完成類加載任務(wù),就成功返回;只有父加載器無法完成此加載任務(wù)時,才自己去加載。

緩存機(jī)制。緩存機(jī)制將會保證所有加載過的Class都會被緩存,當(dāng)程序中需要使用某個Class時,類加載器先從緩存區(qū)中搜尋該Class,只有當(dāng)緩存區(qū)中不存在該Class對象時,系統(tǒng)才會讀取該類對應(yīng)的二進(jìn)制數(shù)據(jù),并將其轉(zhuǎn)換成Class對象,存入緩沖區(qū)中。這就是為很么修改了Class后,必須重新啟動JVM,程序所做的修改才會生效的原因。

2.這里說明一下雙親委派機(jī)制:

jvm之java類加載機(jī)制和類加載器(ClassLoader)的用法

雙親委派機(jī)制,其工作原理的是,如果一個類加載器收到了類加載請求,它并不會自己先去加載,而是把這個請求委托給父類的加載器去執(zhí)行,如果父類加載器還存在其父類加載器,則進(jìn)一步向上委托,依次遞歸,請求最終將到達(dá)頂層的啟動類加載器,如果父類加載器可以完成類加載任務(wù),就成功返回,倘若父類加載器無法完成此加載任務(wù),子加載器才會嘗試自己去加載,這就是雙親委派模式,即每個兒子都很懶,每次有活就丟給父親去干,直到父親說這件事我也干不了時,兒子自己才想辦法去完成。

雙親委派機(jī)制的優(yōu)勢:采用雙親委派模式的是好處是Java類隨著它的類加載器一起具備了一種帶有優(yōu)先級的層次關(guān)系,通過這種層級關(guān)可以避免類的重復(fù)加載,當(dāng)父親已經(jīng)加載了該類時,就沒有必要子ClassLoader再加載一次。其次是考慮到安全因素,java核心api中定義類型不會被隨意替換,假設(shè)通過網(wǎng)絡(luò)傳遞一個名為java.lang.Integer的類,通過雙親委托模式傳遞到啟動類加載器,而啟動類加載器在核心Java API發(fā)現(xiàn)這個名字的類,發(fā)現(xiàn)該類已被加載,并不會重新加載網(wǎng)絡(luò)傳遞的過來的java.lang.Integer,而直接返回已加載過的Integer.class,這樣便可以防止核心API庫被隨意篡改。

以上這篇jvm之java類加載機(jī)制和類加載器(ClassLoader)的用法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
老司机免费视频一区二区| 国产精品久久久久久久久妇女| 国产夫妻在线| 日韩免费高清| 久久久亚洲一区| 99精品在线| 99国产一区| 蜜桃av一区二区| 日韩免费精品| 国产精品一二| 中文字幕在线视频网站| 91精品一区国产高清在线gif| 欧美成人精品| 国产在线欧美| 一区二区三区国产在线| 国产欧美一区| 88xx成人免费观看视频库| 亚洲一卡久久| 国产精品**亚洲精品| 韩国精品主播一区二区在线观看 | 黑丝一区二区三区| 一级成人国产| 久久精品天堂| 国产韩日影视精品| 日本不卡一二三区黄网| 欧美精品97| 国产+成+人+亚洲欧洲在线| 私拍精品福利视频在线一区| 亚洲精品女人| 国产精品原创| 日韩中文字幕1| 国内在线观看一区二区三区| 日韩视频在线一区二区三区| 国产日韩视频| 99久久婷婷| 国产精品久久久久久久久久白浆 | 国产精品蜜月aⅴ在线| 久久国产成人午夜av影院宅| 综合激情在线| 久久精品网址| 蜜桃久久久久久| 久久久久久婷| 日本综合精品一区| 91精品一区二区三区综合在线爱 | 视频一区免费在线观看| 久久精品女人| 四虎在线精品| 国产中文一区| 欧美黄色一区| 免费观看在线色综合| 日韩欧美一区二区三区在线视频| 亚洲精品高潮| 久久天堂av| 国产精品片aa在线观看| 亚洲综合二区| 中文在线免费视频| 国产伦理久久久久久妇女| 五月天久久网站| 免费一级欧美在线观看视频| 在线精品视频一区| 中文另类视频| 久久精品国产久精国产爱| 水蜜桃久久夜色精品一区的特点| 国产91在线精品| 国产精品xvideos88| 日本在线成人| 99国产精品自拍| 日韩国产欧美| 久久免费福利| 欧美日本不卡高清| 亚洲精品麻豆| 快she精品国产999| 国产精品普通话对白| 成人啊v在线| 成人亚洲一区二区| 麻豆视频久久| 国产精品三p一区二区| 亚洲精品福利| 天堂成人免费av电影一区| 久久久精品午夜少妇| 久久电影tv| 天堂中文av在线资源库| 麻豆国产91在线播放| 国产日韩中文在线中文字幕| 亚洲ww精品| 一级成人国产| 蜜桃传媒麻豆第一区在线观看| 国产综合亚洲精品一区二| 蜜臀久久精品| 日韩大片在线播放| 欧美aa在线观看| 日本少妇一区| 欧美日韩国产高清电影| 午夜国产一区二区| 欧洲亚洲一区二区三区| 丝袜av一区| 欧美日韩精品免费观看视欧美高清免费大片 | 精品网站999| 日韩和欧美一区二区| 亚洲精品自拍| 日本午夜精品久久久久| 国产日韩欧美一区| 欧美极品中文字幕| 精品入口麻豆88视频| 精品三级在线| 人在线成免费视频| 欧洲亚洲一区二区三区| 999久久久国产精品| 韩日一区二区三区| 日韩一级不卡| 丝袜脚交一区二区| 亚洲精品视频一二三区| 国产欧美日韩一级| 久久久久久婷| 蜜桃国内精品久久久久软件9| 99国产精品私拍| 在线观看视频免费一区二区三区| 日韩中出av| 国产精品扒开腿做爽爽爽软件| 国产一区二区三区探花| 亚洲成av人片一区二区密柚| 亚洲精品一二三区区别| 亚洲精品看片| 欧美韩一区二区| 成人看片网站| 亚洲国产专区| 亚洲精品看片| 精品视频亚洲| 免费成人网www| 亚洲狼人精品一区二区三区| 久久国产精品色av免费看| 成人一二三区| 亚洲尤物在线| 国产精品一级| 国产二区精品| 久久国产精品色av免费看| 日韩深夜视频| 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品美女午夜爽爽| 久久在线视频免费观看| 中文字幕亚洲精品乱码| 精品视频国产| 91久久久久| 麻豆精品av| 国产亚洲福利| 国产精品v一区二区三区| 91精品亚洲| 91成人在线精品视频| 精品国产亚洲一区二区三区在线| 久久黄色影院| 日本免费在线视频不卡一不卡二| 成人国产精品一区二区免费麻豆| 国产亚洲毛片在线| 九九99久久精品在免费线bt| 日韩午夜av在线| 国产乱子精品一区二区在线观看| 精品欧美一区二区三区在线观看| 一区二区精彩视频| 久久青草久久| 国产调教精品| 午夜在线精品偷拍| 国产91在线精品| 日韩精彩视频在线观看| 91精品综合| 麻豆视频久久| 亚洲影院天堂中文av色| 成人小电影网站| 欧美精品三级在线| 老牛影视一区二区三区| 最近高清中文在线字幕在线观看1| 视频一区二区中文字幕| 亚洲永久av| 国产精品入口久久| 免费成人在线影院| 极品日韩av| 国产成人精品一区二区三区免费 | 国产精选一区| 亚洲精品一级| 久久国产精品99国产| 99视频精品全国免费| 国产va免费精品观看精品视频| 日本va欧美va瓶| 在线日韩中文| 大香伊人久久精品一区二区| 欧美一区自拍| 免费视频最近日韩| 亚洲国产一区二区三区在线播放 | 亚洲精品三级| 水野朝阳av一区二区三区| 国产伊人精品| 在线日韩视频| 成人羞羞在线观看网站| 成人综合一区| 国产高清日韩| 日韩精品一级| 一区二区三区四区日韩| 蜜桃视频免费观看一区| 久久不射网站| 久久高清免费观看| 久热精品在线|