成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

jvm類加載的過程

CoyPan / 1120人閱讀

摘要:這個階段虛擬機會保證父類的方法會在子類的方法前執(zhí)行,而且在多線程環(huán)境中,虛擬機會保證方法的同步。

一個類從加載到虛擬機到使用結(jié)束從虛擬機卸載包括了加載、驗證、準備、解析、初始化、使用、卸載,即為一個類的生命周期


下面來看一下類加載的過程,即加載、驗證、準備、解析、初始化5個階段都做了什么事:

階段1:加載
加載階段虛擬機主要3件事:

通過類的全名獲取其二進制字節(jié)流;

將字節(jié)流代表的靜態(tài)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)識別的運行時數(shù)據(jù)結(jié)構(gòu);

在內(nèi)存中實例化這個類的java.lang.Class對象(不一定在堆內(nèi)存中的,HotSpot就將Class對象放在了方法區(qū)里),程序訪問這個類在方法區(qū)中的類型數(shù)據(jù)時會通過這個類去訪問;
以上三點虛擬機并不要求如何實現(xiàn),只是一個規(guī)范,比如第一步,通過類全名獲取其二進制流,動態(tài)代理技術(shù)是在運行時獲取、JSP應(yīng)用是根據(jù)jsp文件獲取并生成對應(yīng)的Class以及從ZIP包中獲取(JAR、EAR、WA同理)等

階段2:驗證
驗證階段大體上會完成4個階段的驗證(文件格式驗證、元數(shù)據(jù)驗證、字節(jié)碼驗證、符號引用驗證),以保證虛擬機中類的規(guī)范和安全。

文件格式驗證,校驗字節(jié)流是否復(fù)合Class文件的格式:

驗證文件是否以魔數(shù)0xCAFEBABE(十六進制class文件中的前4個字節(jié))開頭;

主、次版本號(十六進制class文件中的第5、第6個字節(jié))能否被當(dāng)前版本的虛擬機處理;

常量池中是否有不被支持的類型;

指向常量的索引中是否指向了不存在的常量;

Class文件中各個部分以及文件本身是否有被刪除或附加的其他信息;

......

元數(shù)據(jù)類型,校驗語義是否符合Java語言規(guī)范的要求:

驗證類是否有父類(除了java.lang.Object);

驗證父類是否繼承了不可被繼承的類;

如果不是抽象類,那么要判斷是否實現(xiàn)了父類或接口的所要求實現(xiàn)的所有方法;

......

字節(jié)碼驗證,校驗類的方法體,確定語義是否符合邏輯:

保證操作數(shù)棧中的數(shù)據(jù)類型與指令序列一致;

保證跳轉(zhuǎn)指令不會跳到方法體外的字節(jié)碼指令上;

保證方法體中的類型轉(zhuǎn)換有效;

......

階段3:準備
準備階段是為類變量分配內(nèi)存并設(shè)置類變量初始值的階段

這里所說的初始值并不是指代碼賦的值,而是數(shù)據(jù)類型的默認值,如public static int value = 123; 在準備階段過后,value會被置為0,而不是123。
同時要注意,public static final int value = 123; 這種使用final修飾的變量,在準備階段就會被賦值為123,而不是初始值。

階段4:解析
解析階段會將常量池內(nèi)的符號引用轉(zhuǎn)換為直接引用,關(guān)于符號引用和直接引用的解釋如下: 

符號引用:以一組符號來描述所引用的目,比如定義了在類IntF中定義了intValue = 123,接著讓Test.foo中的a變量指向Intf.intValue:

    public class Test{
        public void foo(){
            int a = Intf.intValue;
        }
    }
    class Intf{
        public static int intValue = 123;
    }

編譯代碼之后我們用javap -verbose Test來查看class文件中的內(nèi)容:

   Constant pool:
   #1 = Methodref          #4.#12         // java/lang/Object."":()V
   #2 = Fieldref           #13.#14        // Intf.intValue:I
   #3 = Class              #15            // Test
   #4 = Class              #16            // java/lang/Object
 // 省略部分代碼...
  public void foo();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=2, args_size=1
         0: getstatic     #2                  // Field Intf.intValue:I
         3: istore_1
         4: return
      LineNumberTable:
        line 3: 0
        line 4: 
可以看到常量池第2項是一個符號引用,指向了Intf.intValue

直接引用:就是我們常說的指針或者句柄,直接引用的目標一定會在虛擬機內(nèi)存中存在。

階段5:初始化

初始化階段是類加載的最后一個階段,主要執(zhí)行類的方法(不同與方法,方法是在顯式調(diào)用constructor時執(zhí)行,而方法在初始化階段就會執(zhí)行),()方法會執(zhí)行賦值操作和執(zhí)行靜態(tài)語句快中的內(nèi)容,換句話說,如果代碼中沒有靜態(tài)語句塊和賦值操作,那么就可以沒有()方法。
這個階段虛擬機會保證父類的()方法會在子類的()方法前執(zhí)行,而且在多線程環(huán)境中,虛擬機會保證()方法的同步。

參考文獻:《深入理解Java虛擬機》 - 周志明

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72915.html

相關(guān)文章

  • JVM加載過程 & 雙親委派模型

    摘要:類加載過程雙親委派模型聲明文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處類加載過程類加載機制將類描述數(shù)據(jù)從文件中加載到內(nèi)存,并對數(shù)據(jù)進行,解析和初始化,最終形成被直接使用的類型。深入理解虛擬機高級特性與最佳實踐加載加載階段由類加載器負責(zé),過程見類加載 JVM類加載過程 & 雙親委派模型 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處https://segmentfault.com/u/yzwall ...

    happen 評論0 收藏0
  • JVM實戰(zhàn)---加載過程

    任何程序都需要加載到內(nèi)存才能與CPU進行交流 同理, 字節(jié)碼.class文件同樣需要加載到內(nèi)存中,才可以實例化類 ClassLoader的使命就是提前加載.class 類文件到內(nèi)存中 在加載類時,使用的是Parents Delegation Model(溯源委派加載模型) Java的類加載器是一個運行時核心基礎(chǔ)設(shè)施模塊,主要是在啟動之初進行類的加載、鏈接、初始化 showImg(https://s...

    bladefury 評論0 收藏0
  • 從一無所知到無所不知————jvm系列(1)

    摘要:學(xué)習(xí)能更深入的理解這門語言,能理解語言底層的執(zhí)行過程,深入到字節(jié)碼層次。 目錄 ? 前言 程序的運行 1.JVM類加載機制 ①一般在什么情況下會去加載一個類?也就是說,什么時候.class字節(jié)碼文件中加載這個類到JVM內(nèi)存里來? ②驗證、準備、初始化 ③初始化 2.類加載器和雙親委派機制 ...

    Betta 評論0 收藏0
  • JVM 工作原理,層次結(jié)構(gòu) 以及 GC工作原理

    摘要:執(zhí)行引擎作用執(zhí)行字節(jié)碼,或者執(zhí)行本地方法運行時數(shù)據(jù)區(qū)其實就是指在運行期間,其對內(nèi)存空間的劃分和分配。 雖是讀書筆記,但是如轉(zhuǎn)載請注明出處https://uestc-dpz.github.io..拒絕伸手復(fù)制黨 JVM Java 虛擬機 Java 虛擬機(Java virtual machine,JVM)是運行 Java 程序必不可少的機制。JVM實現(xiàn)了Java語言最重要的特征:即平臺...

    qqlcbb 評論0 收藏0
  • JVM加載過程分析及驗證

    摘要:類加載過程共分為加載驗證準備解析初始化使用和卸載七個階段這些階段通常都是互相交叉的混合式進行的,通常會在一個階段執(zhí)行的過程中調(diào)用或激活另外一個階段。 JVM類加載過程共分為加載、驗證、準備、解析、初始化、使用和卸載七個階段showImg(https://segmentfault.com/img/bV0D9R?w=634&h=203);這些階段通常都是互相交叉的混合式進行的,通常會在一個...

    zhangyucha0 評論0 收藏0
  • 學(xué)習(xí)JVM是如何從入門到放棄?

    摘要:而字節(jié)碼運行在之上,所以不用關(guān)心字節(jié)碼是在哪個操作系統(tǒng)編譯的,只要符合規(guī)范,那么,這個字節(jié)碼文件就是可運行的。好處防止內(nèi)存中出現(xiàn)多份同樣的字節(jié)碼安全性角度特別說明類加載器在成功加載某個類之后,會把得到的類的實例緩存起來。 前言 只有光頭才能變強 JVM在準備面試的時候就有看了,一直沒時間寫筆記。現(xiàn)在到了一家公司實習(xí),閑的時候就寫寫,刷刷JVM博客,刷刷電子書。 學(xué)習(xí)JVM的目的也很簡單...

    Joyven 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<