久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      JAVA虛擬機(jī)(JVM)詳細(xì)介紹(五)——類加載機(jī)制

      上篇中我們講解了Class文件,這篇我們說說虛擬機(jī)是如何加載這些Class文件的?Class文件中的信息進(jìn)入到虛擬機(jī)后會發(fā)生什么變化?這就涉及到了類加載機(jī)制。

      類加載機(jī)制是把類的數(shù)據(jù)從Class文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗,轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的java類型。這一系列的過程都是在程序運行期間完成的。

      類加載器

      類加載器就是下圖中紅框的部分,它通過一個類的全限定名來獲取描述此類的二進(jìn)制字節(jié)流,從而將java類動態(tài)地加載進(jìn)JVM的內(nèi)存空間中。

      JAVA虛擬機(jī)(JVM)詳細(xì)介紹(五)——類加載機(jī)制

      適用情景

      對于一個非數(shù)組類的加載階段,可以使用系統(tǒng)提供的引導(dǎo)類加載器來完成,也可以由用戶自定義的類加載器去完成。
      對于數(shù)組類而言,其由java虛擬機(jī)直接創(chuàng)建,不通過類加載器。

      雙親委派機(jī)制

      雙親委派機(jī)制是類加載所采取的一種方式。如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成。每一層的類加載器均是如此。只有當(dāng)父加載器反饋自己無法完成這個請求時,子加載器才會嘗試自己去加載。

      JAVA虛擬機(jī)(JVM)詳細(xì)介紹(五)——類加載機(jī)制

      類比到現(xiàn)實:小明想買一個玩具挖土機(jī),可他又不好意思直接張口說。所以,發(fā)生了下面的對話。

      小明去問他爸爸:爸爸你有挖土機(jī)嗎?
      爸爸說:沒有哎
      接著爸爸問爺爺:爸爸爸爸,你有挖土機(jī)嗎?
      爺爺說:沒有哎
      接著爺爺問太爺爺:爸爸爸爸,你有挖土機(jī)嗎?
      太爺爺說:我也沒有。讓重孫子去買一個吧。
      結(jié)果小明就高高興興地自己去買了一個玩具挖土機(jī)。

      分類

      啟動類加載器是使用C++實現(xiàn)的,是虛擬機(jī)自身的一部分。
      其它類加載器是由java語言實現(xiàn)的,獨立于虛擬機(jī)外部,并且全都繼承自抽象類java.lang.ClassLoader。

      好處

      以String類為例。就算是用戶自己寫了一個String類的實現(xiàn),那對此類進(jìn)行加載時,也只會委派給啟動類加載器來對JDK中原本的String類進(jìn)行加載,而自定義的String類永遠(yuǎn)不會被調(diào)用。這樣保證了系統(tǒng)的安全。

      什么時候進(jìn)行類加載?

      有且只有以下5種方式必須立即對類進(jìn)行加載

      (1)使用new實例化對象的時候;讀取或配置一個類的靜態(tài)字段(被final修飾、已在編譯期把結(jié)果放入常量池的靜態(tài)字段除外)的時候;調(diào)用一個類的靜態(tài)方法的時候。

      (2)使用java.lang.reflect包的方法對類進(jìn)行反射調(diào)用的時候。如果類沒有進(jìn)行過初始化,則需要先觸發(fā)其初始化。

      (3)當(dāng)初始化一個類的時候,如果發(fā)現(xiàn)其父類還沒有進(jìn)行過初始化,則需要先觸發(fā)其父類的初始化。

      (4)當(dāng)虛擬機(jī)啟動時,用戶需要指定一個要執(zhí)行的主類(包含main()方法的類),虛擬機(jī)會先初始化這個主類

      類加載過程詳述

      類加載過程分為5步。大部分都是由虛擬機(jī)主導(dǎo)和控制的,除了以下兩種情形:

      在加載階段

      開發(fā)人員可以通過自定義類加載器參與

      在初始化階段

      會執(zhí)行開發(fā)人員的代碼去初始化類變量和其它資源

      1、加載

      虛擬機(jī)需要完成的事情:
      (1) 通過一個類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流。
      (2)將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu)。
      (3)在內(nèi)存中生成一個代表這個類的java.lang.Class對象,作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口。

      JAVA虛擬機(jī)(JVM)詳細(xì)介紹(五)——類加載機(jī)制

      2、驗證

      驗證的目的是確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,不會危害虛擬機(jī)自身的安全。
      其分為4個步驟:文件格式驗證,元數(shù)據(jù)驗證,字節(jié)碼驗證,符號引用驗證。其中文件格式驗證是直接對字節(jié)流進(jìn)行操作的,其余3項是在方法區(qū)中進(jìn)行的。

      3、準(zhǔn)備

      此階段是正式為類變量分配內(nèi)存并設(shè)置類變量初始值的階段。其是在方法區(qū)中進(jìn)行分配的。有兩個注意點:

      (1)此時只是對類變量(被static修飾的變量)進(jìn)行內(nèi)存分配,而不是對象變量。給對象分配內(nèi)存是在對象實例化時,隨著對象一起分配到j(luò)ava堆中。

      (2)如果一個類變量沒有被final修飾,則其初始值是數(shù)據(jù)類型的零值。比如int類型的是0,boolean類型的是false。舉個例子來說明:

      public static int value=123;

      在準(zhǔn)備階段過后的初始值為0而不是123,因為這個時候尚未開始執(zhí)行任何java方法,而把value賦值為123的putstatic指令是程序被編譯后,存放于類構(gòu)造器< clinit >()方法之中。所以把value賦值為123的動作將在初始化階段才會執(zhí)行。

      public static final int value=123;

      此時因為有final,所以在準(zhǔn)備階段value就已經(jīng)被賦值為123了。

      4、解析

      解析階段是虛擬機(jī)將常量池內(nèi)的符號引用替換為直接引用的過程??蓪︻惢蚪涌凇⒆侄?、類方法、接口方法等進(jìn)行解析。

      符號引用是什么:

      符號引用就是包含類的信息,方法名,方法參數(shù)等信息的字符串,它供實際使用時在該類的方法表中找到對應(yīng)的方法。

      直接引用是什么:

      直接引用就是偏移量,通過偏移量可以直接在該類的內(nèi)存區(qū)域中找到方法字節(jié)碼的起始位置。
      符號引用是告訴你此方法的一些特征,你需要通過這些特征去尋找對應(yīng)的方法。直接引用就是直接告訴你此方法在哪。

      5、初始化

      此階段用于初始化類變量和其它資源,是執(zhí)行類構(gòu)造器< clinit >()方法的過程,此時才是真正開始執(zhí)行類中定義的java程序代碼。

      以上是對JAVA虛擬機(jī)類加載機(jī)制的詳細(xì)講解,

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號