<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Change Dir

    先知cd——熱愛生活是一切藝術(shù)的開始

    統(tǒng)計

    留言簿(18)

    積分與排名

    “牛”們的博客

    各個公司技術(shù)

    我的鏈接

    淘寶技術(shù)

    閱讀排行榜

    評論排行榜

    JVM學(xué)習(xí)筆記(3)——連接模型(上)

    很重要的內(nèi)容,可能分幾天記錄

    1. jvm為每個裝載的類和接口保存一份獨立的常量池。
    2. 動態(tài)加載最常用的是Class.forName(),這個方法有兩個重載版本:Class.forName(String name)和Class.forName(String name, boolean init, ClassLoader loader)。它們均內(nèi)部調(diào)用了forName0(String name, boolean initialize,ClassLoader loader),這是個native方法。前者調(diào)用傳遞的參數(shù)是name、true和啟動類加載器。name是要加載類的全限定名,init表明是否要初始化,如果這個類已經(jīng)被初始化過,這樣的加載即使init是true也不會被再初始化,loader是要加載的類加載器,null的話使用默認的啟動類加載器。
    3. 另一種方式動態(tài)加載類就是ClassLoader.loadClass()方法,這個方法也是兩個重載版本:ClassLoader.loadClass(String name)和ClassLoader.loadClass(String name, boolean resolve),其中前者調(diào)用了后者,resolve傳遞false,resolve表示是否在裝載時執(zhí)行該類的連接。
    4. loadClass不初始化類,而forName初始化類,因此如果是需要動態(tài)加載類,該類馬上被用到那么應(yīng)該初始化,loadClass只加載,有可能出問題,但是會有安全考慮。
    5. 常量池解析:上一篇日志也記錄到了,在完成驗證和準(zhǔn)備后,要進入解析階段,而解析主要做的就是解析常量池,把符號引用轉(zhuǎn)為直接引用。
    6. 對常量池CONSTANT_Class_info的解析,主要解析類和接口的符號引用,有兩種入口:1)數(shù)組類,指向數(shù)組類的符號引用最后解析為一個Class的實例,如果數(shù)組的元素類型是引用類型,虛擬機用當(dāng)前類加載器解析類型,如果數(shù)組是基本類型,虛擬機會立即創(chuàng)建關(guān)于那個元素類型的新數(shù)組類,確定維數(shù),然后創(chuàng)建Class實例表示這個類,由啟動類加載器定義。2)非數(shù)組類,第一步,裝載類型或者任何超類型,先確定引用類型已經(jīng)被當(dāng)前類裝載器裝載過,虛擬機保證每一個類裝載器都只裝載一個給定名字的類型,這個步驟只是確定類型是否被裝載,期間可能拋出的異常有:NoClassDefFoundError,ClassNotFoundError,ClassFormatError,UnsupportedClassVersionError,LinkageError,ClassCircularityError,IncompatibleClassChangeError;第二步,檢查訪問權(quán)限,如果發(fā)起引用的類型沒有訪問被引用類型的權(quán)限,jvm拋出IllegalAccessError;第三步,校驗類型,出錯則拋出VerifyError;第四步,準(zhǔn)備類型,前面講過,就是為不同類型分配內(nèi)存;第五步,可選的解析類型,第六步,初始化。
    7. 對常量池CONSTANT_Fieldref_info的解析,完成對Class_info的解析后,JVM按照一定順序搜索字段:在被引用的類型中查找具有指定名字和類型的字段,找不到,則檢查類型直接實現(xiàn)或擴展的接口,遞歸檢查其超接口,如果還找不到,檢查類型直接的超類,并遞歸檢查其所有超類,如果找不到,則失敗,拋出NoSuchFieldError異常。找到字段,但是沒有訪問權(quán)限,拋出IllegalAccessError異常。解析完后標(biāo)記該常量池入口為已解析,并在數(shù)據(jù)中放入指向這個字段的直接引用。
    8. 對常量池CONSTANT_Methodref_info的解析,完成對Class_info的解析后,JVM按照一定順序搜索方法:如果被解析類型是一個接口,虛擬機拋出IncompatibleClassChangeError異常,如果是個類,JVM檢查被引用的類是否有一個方法符合指定的名字以及描述符,如果不符合,找該類的超類,并遞歸找所有超類,還是找不到,虛擬機檢查該類是否直接實現(xiàn)了任何接口,并遞歸檢查接口的超接口,還找不到,則拋出NoSuchMethodError異常,如果找到但是沒有訪問權(quán)限,拋出IllegalAccessError異常。解析完后標(biāo)記常量池入口為已解析,并在數(shù)據(jù)中放入指向這個方法的直接引用。
    9. 對常量池CONSTANT_InterfaceMethodref_info的解析,完成對Class_info的解析后,JVM按照一定順序在接口和它的超類型中搜索方法:如果被解析的類型不是接口是類,拋出IncompatibleClassChangeError異常,否則檢查接口是否有符合指定名字和限定符的方法,如果沒有,JVM檢查接口的直接超接口并遞歸檢查所有超接口以及java.lang.Object類來找,如果還沒有,拋出NoSuchMethodError異常。解析完后標(biāo)記常量池入口為已解析,并在數(shù)據(jù)中放入指向這個方法的直接引用。

    posted on 2012-09-21 14:17 changedi 閱讀(460) 評論(0)  編輯  收藏 所屬分類: Java技術(shù)

    主站蜘蛛池模板: 久久免费观看视频| 久久精品无码免费不卡| 日本zzzzwww大片免费| 久久久久亚洲AV无码网站| 精品福利一区二区三区免费视频| 亚洲五月激情综合图片区| 最近免费中文字幕大全高清大全1| 亚洲成人精品久久| 波多野结衣免费在线| ASS亚洲熟妇毛茸茸PICS| 午夜视频在线观看免费完整版| 亚洲av无码专区青青草原| 免费一级毛片在线播放不收费| 一边摸一边桶一边脱免费视频| 国产亚洲综合色就色| 7m凹凸精品分类大全免费| 亚洲二区在线视频| 国产无遮挡吃胸膜奶免费看视频 | 亚洲精品第一国产综合野| 毛片视频免费观看| 黄色a级免费网站| 国产亚洲色婷婷久久99精品| 国产成人AV片无码免费| 亚洲自国产拍揄拍| 亚洲高清无码在线观看| 无码中文字幕av免费放dvd| 亚洲精品国产精品国自产网站| 免费一级毛片在线观看| 日本免费一区二区久久人人澡| 亚洲一区无码中文字幕乱码| 免费人成视频在线观看不卡| 免费看无码特级毛片| 亚洲色丰满少妇高潮18p| 日本亚洲国产一区二区三区| 18禁止看的免费污网站| 国产精品亚洲va在线观看| 亚洲成亚洲乱码一二三四区软件| 国拍在线精品视频免费观看| 成人一级免费视频| 亚洲一卡2卡4卡5卡6卡残暴在线| 亚洲精品麻豆av|