• <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>

    Java面試之JVM復習(四)

    JVM類加載機制分為五個部分:加載,驗證,準備,解析,初始化

    方式/步調

    • 加載:這個階段會在內存中生當作一個代表這個類的java.lang.Class對象,作為方式區這個類的各類數據進口。要注重的是這里紛歧定非要從一個Class文件獲取,這里既可以從ZIP包中讀取(好比jar包和war包中讀取),也可以在運行時計較生當作(動態代辦署理),也可以由其它文件生當作(好比將JSP文件轉換當作對應的Class類)。


      驗證:這一階段本家兒如果為了確保Class文件的字節省中包含的信息是否合適當前虛擬機的要求,而且不會風險虛擬機自身的平安。


      籌辦:正式為類變量分派內存并設置類變量的初始值階段,即在方式區平分配這些變量所利用的內存空間。注重這里按圖必然義,現實上變量v在籌辦階段事后的初始值為0而不是8080,將V賦值為8080的put static 指令是程序被編譯后,存放于類機關器<client>方式之中。可是若是按圖二聲明,在編譯階段會為v生當作ConstantValue屬性,在籌辦階段虛擬機遇按照ConstantValue屬性將v賦值為80800

    • 解析:虛擬機將常量池中的符號引用替代為直接引用的過程。符號引用就是

      class文件中的:

      1.CONSTANT_Class_info   

      2.CONSTANT_Field_info
      3.CONSTANT_Method_info

      等類型的常量。

    • 初始化階段是類加載最后一個階段,前面的類加載階段之后,除了在加載階段可以自界說類加載器以外,其它操作都由JVM本家兒導。到了初始階段,才起頭真正執行類中界說的java程序代碼。

    • 類加載器: 虛擬機設計團隊把加載動作放到JVM外部實現,以便讓應用程序決議若何獲取所需的類,JVM供給了3種類加載器:

           1.啟動類加載器:負責加載JAVA_HOME\lib目次中的,或經由過程-Xbootclasspath參數指定路徑中的,且被虛擬機承認(按文件名識別,如rt.jar)的類。


           2.擴展類加載器:負責加載JAVA_HOME\lib\ext目次中的,或經由過程java.ext.dirs系統變量指定路徑中的類庫。


           3.應用程序類加載器:負責加載用戶路徑(classpath)上的類庫。JVM經由過程雙親委派模子進行類的加載,當然我們也可以經由過程擔當java.lang.ClassLoader實現自界說的類加載器。

    • 雙親委派:當一個類收到類加載請求,他起首不會測驗考試本身加載這個類,而是把這個請求委派給父類區完當作,每一個條理類加載器都是如斯,是以所有的加載請求都應該傳動到啟動類加載器中,只有當父類加載器反饋本身無法完當作這個請求的時辰(在它的加載路徑下沒有找到所需加載的Class),子類加載器才會測驗考試本身去加載。


      采用雙親委派的一個益處是好比加載位于rt.jar包中的類java.lang.object,不管是哪個加載器加載這個類,最終城市委托給頂層啟動類加載器進行加載,這樣包管了利用分歧的類加載器加載,最終獲得的都是同樣一個object對象。

    • OSGI(動態模子系統):面標的目的java的動態模子系統,是java動態化模塊化系統的一系列規范。


      OSGI描畫了一個很夸姣的模塊化開辟方針,并且界說了實現這個方針的所需要辦事與架構,同時也有當作熟的框架進行實現撐持。但并非所有的應用都適合采用OSGI作為根本架構,它在供給壯大功能同時,也引入了額外的復雜度,因為它不遵守了類加載的雙親委托模子。

      END
    • 發表于 2020-05-06 19:00
    • 閱讀 ( 697 )
    • 分類:其他類型

    你可能感興趣的文章

    相關問題

    0 條評論

    請先 登錄 后評論
    聯系我們:uytrv@hotmail.com 問答工具
  • <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>
    久久久久精品国产麻豆