狂人思維·成都
          Google
          軟件架構(gòu),開則持續(xù),合則穩(wěn)健;亦開亦合,剛?cè)岵?講究平衡如同生活之中庸和諧.
          E-MAIL:guojian。zhang@gmail。com
          posts - 19,  comments - 62,  trackbacks - 0

          [摘要]

          類的初始化和對象初始化是 JVM 管理的類型生命周期中非常重要的兩個環(huán)節(jié),Google 了一遍網(wǎng)絡(luò),有關(guān)類裝載機制的文章倒是不少,然而類初始化和對象初始化的文章并不多,特別是從字節(jié)碼和 JVM 層次來分析的文章更是鮮有所見。

          本文主要對類和對象初始化全過程進行分析,通過一個實際問題引入,將源代碼轉(zhuǎn)換成 JVM 字節(jié)碼后,對 JVM 執(zhí)行過程的關(guān)鍵點進行全面解析,并在文中穿插入了相關(guān) JVM 規(guī)范和 JVM 的部分內(nèi)部理論知識,以理論與實際結(jié)合的方式介紹對象初始化和類初始化之間的協(xié)作以及可能存在的沖突問題。


          本文發(fā)表于IBM DW,詳細正文請見 解析JAVA類和對象的初始化過程
          網(wǎng)址:http://www-128.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html

          posted on 2006-09-08 10:15 狂人思維·成都 閱讀(2221) 評論(4)  編輯  收藏 所屬分類: JAVA技術(shù)J2EE應(yīng)用

          FeedBack:
          # re: 深入JVM內(nèi)部解析類和對象的初始化過程
          2006-09-13 00:38 | 飛飛

          張先生:你好,很佩服你的精彩闡述
          我有幾個疑問:1) 按照你的解決方法思路就是在對象實例化之前JVM已經(jīng)調(diào)用了clinit()方法了,也就是類已經(jīng)初始化了,所以類變量也已經(jīng)初始化了
          我想問你這是怎么觸發(fā)類初始化的
          2) 你在文章中提到init()方法包括了"所有具有指定初始化值的實例變量初始化語句",既然如此為什么沒有執(zhí)行CODE_MAP_CACHE = new HashMap()呢?
          希望能得到你的精彩回答!
          謝謝!  回復(fù)  更多評論
            
          # re: 深入JVM內(nèi)部解析類和對象的初始化過程
          2006-09-13 00:39 | 飛飛

          我的郵箱是: zhangtf@sihitech.com.cn  回復(fù)  更多評論
            
          # re: 深入JVM內(nèi)部解析類和對象的初始化過程
          2006-09-13 12:41 | 狂人
          您好,
          1) 按照你的解決方法思路就是在對象實例化之前JVM已經(jīng)調(diào)用了clinit()方法了,也就是類已經(jīng)初始化了,所以類變量也已經(jīng)初始化了我想問你這是怎么觸發(fā)類初始化的。

          該問題在文中已有闡述:

          * "Java 虛擬機規(guī)范為類的初始化時機做了嚴格定義:"initialize on first active use"--" 在首次主動使用時初始化"。"
          *

          首次主動使用的情形:
          o 創(chuàng)建某個類的新實例時--new、反射、克隆或反序列化;
          o 調(diào)用某個類的靜態(tài)方法時;
          o 使用某個類或接口的靜態(tài)字段或?qū)υ撟侄钨x值時(final字段除外);
          o 調(diào)用Java的某些反射方法時
          o 初始化某個類的子類時
          o 在虛擬機啟動時某個含有main()方法的那個啟動類。


          2) 你在文章中提到init()方法包括了"所有具有指定初始化值的實例變量初始化語句",既然如此為什么沒有執(zhí)行CODE_MAP_CACHE = new HashMap()呢?

          "CODE_MAP_CACHE = new HashMap()"語句是執(zhí)行了的,并非您理解的"沒有執(zhí)行",而是在對象實例化時調(diào)用initEnum()方法對CODE_MAP_CACHE初始化并賦值后,又重新在static{ ... }區(qū)塊內(nèi)進行了初始化。這是因為在類還未來得及初始化完畢時,在類自身有一條實例化自身的語句"private static final CachingEnumResolver SINGLE_ENUM_RESOLVER = new CachingEnumResolver();"所導(dǎo)致的。   回復(fù)  更多評論
            
          # re: 深入JVM內(nèi)部解析類和對象的初始化過程
          2006-09-17 18:01 | 化工
          樓主說的確實對我很有用,多謝了!@_@~~  回復(fù)  更多評論
            

          <2006年9月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿

          隨筆分類(31)

          隨筆檔案(19)

          文章分類(3)

          文章檔案(3)

          我關(guān)注的Blogs

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 绥阳县| 瑞丽市| 涟水县| 肃南| 临江市| 突泉县| 三门峡市| 瑞昌市| 昭觉县| 仙桃市| 邹平县| 洞头县| 石景山区| 镇原县| 凌云县| 鄂尔多斯市| 鄢陵县| 航空| 通化市| 剑河县| 唐河县| 玉树县| 永吉县| 大新县| 苗栗县| 依安县| 德钦县| 正定县| 苍南县| 新安县| 扶绥县| 凤冈县| 曲松县| 张家川| 大同县| 洞头县| 乐清市| 囊谦县| 广元市| 南丰县| 北票市|