Feng.Li's Java See

          抓緊時間,大步向前。
          隨筆 - 95, 文章 - 4, 評論 - 58, 引用 - 0

          導航

          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(7)

          隨筆分類

          隨筆檔案

          文章檔案

          相冊

          大家都在博

          • 東東同學
          • 也許,在每個人的心靈深處,都會有一份屬于自己的寧靜
          • 亞明先生
          • 誰說世間無高人?且看我“物質生活”
          • 大飛
          • 此大飛,非彼大飛,乃宿舍長兼學生會主席
          • 玉東同學
          • 小男人

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          JVM使用方法區信息例子

          本文是對JVM執行一個Class文件的過程的一個總結。比如,現在我有2個類:
          1:Class Lava {
          ?? private int speed = 5;
          ?? void flow() {}
          }
          2:??? Class Volcano {
          ?? public static void main(String [] args) {
          ??? Lava lava =? new Lava ();
          ??? lava.flow()
          }
          }
          下面就是JVM的某個實現執行Class文件的一個過程:

          1:JVM找到并讀入相應的Class文件 :Volcano.class,然后把導入的二進制數據中提取的類型信息保存到方法區(方法區:保存類型信息的運行時數據區,也就是JVM內存管理體系結構的一個組成)

          2:執行保存在方法區的字節碼 (執行main()方法的字節碼,)在執行時,持有指向Volcano類常量池的一個指針 (常量池:就是一個符號引用 如:Lava lava = new Lava()這句中的Lava就是一個符號引用)

          3:JVM只在需要時才裝載類(動態連接) 。JVM使用常量池指針找到第一項,發現是"Lava"字符串,檢查方法區,發現Lava類并未被裝載。


          4:開始裝載Volcano.class,同樣,把讀入的二進制數據中的類型信息放到方法區。

          5:JVM用一個直接指向方法區Lava類數據的指針來替換常量池的第一項,也就是原先的“Lava”字符串。 這個過程就是所謂的:“常量池解析”---符號引用替換為直接引用。

          6:JVM準備為新的Lava對象分配內存。分配對象當然需要類型信息,此時,用剛才替換的那個指針,也就是替換“Lava”字符串的那個指針(此時,這個指針指向方法區Lava類的數據)來訪問Lava的類型信息(這個信息剛放到方法區)。找出其中記錄的這樣一個信息:需要分配多少內存。

          7:確定內存要多大以后,在堆上分配內存,并初始化變量,包括超類的變量()。

          8:把新生成的Lava對象引用壓到Java棧中。到此,完成Lava lava = new Lava(); speed初始化為0。

          9:通過此時生成的Lava引用,把speed 初始化為正確的值 :5

          10: 通過這個引用調用Flow()。

          以上為我以一個例子來說明JVM 的一個實現執行Class的流程,歡迎大家閱讀和提出意見.

          posted on 2006-12-14 12:05 小鋒 閱讀(2159) 評論(4)  編輯  收藏 所屬分類: J2SE

          評論

          # re: JVM使用方法區信息例子  回復  更多評論   

          《深入Java虛擬機》這本書真不錯,講的很清楚啊。。。
          2007-08-23 22:44 | carrincha

          # re: JVM使用方法區信息例子  回復  更多評論   

          個人感覺第8和9需要修改一下
          改為“通過Lava的默認構造函數將Lava對象壓入棧中,并完成初試化”
          應該說明下lava被壓入的原因 這樣才清晰 你說呢?
          2008-10-23 11:11 | wangc

          # re: JVM使用方法區信息例子  回復  更多評論   

          關于speed的兩次初始化 你有何依據 能不能說來聽聽:)
          2008-10-23 11:14 | wangc

          # re: JVM使用方法區信息例子  回復  更多評論   

          帖子不能修改 這個很頭疼
          2008-10-24 09:22 | wangc
          主站蜘蛛池模板: 新乡县| 白银市| 泸西县| 孟津县| 西宁市| 宜宾市| 朝阳市| 黄山市| 浑源县| 南漳县| 讷河市| 武陟县| 长顺县| 清苑县| 永福县| 贵州省| 平顺县| 洮南市| 南丹县| 海晏县| 巴青县| 汉川市| 罗源县| 鄢陵县| 林口县| 平定县| 镇原县| 大冶市| 莲花县| 稷山县| 成都市| 淮北市| 桃园市| 鹤庆县| 锡林郭勒盟| 旬阳县| 永城市| 北川| 大埔县| 红桥区| 嘉祥县|