Feng.Li's Java See

          抓緊時間,大步向前。
          隨筆 - 95, 文章 - 4, 評論 - 58, 引用 - 0
          數據加載中……

          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
          主站蜘蛛池模板: 中方县| 射洪县| 广东省| 桃园县| 新竹县| 都匀市| 西藏| 湖州市| 自贡市| 德昌县| 台东市| 香港 | 石台县| 怀仁县| 蒙阴县| 商水县| 临高县| 南丹县| 建始县| 定南县| 泰州市| 台东县| 安化县| 南陵县| 河间市| 开阳县| 江源县| 龙门县| 泗洪县| 北海市| 西青区| 东乡县| 绿春县| 滦平县| 罗源县| 云霄县| 沅江市| 莱芜市| 瑞昌市| 微山县| 获嘉县|