gr8vyguy@Blogjava

          親身體驗JIT(Just in time compilation)

          JIT是Just in time compilation的縮寫, 是一種利用在運行時將字節碼(Bytecode)翻譯為機器碼(Machine code),并保存在內存中, 在后續的運行中直接調用機器碼, 從而改善字節碼編譯語言性能的技術。JVM的Hotspot就是Java虛擬機中JIT的實現.

          簡單的說,也就是當一段代碼被運行的次數大于某個值時, 成為所謂的"Hot Spots", JVM就會把這段代碼編譯成機器碼. 通過下面的程序,我們將看到JVM的Hot Spot所起的作用. 程序中用到了一個高精度的Java計時器, 看我的另外一篇隨筆用JNI實現一個高精度的Java計時器.
           1 public class JITDemo {
           2 
           3     public static void main(String[] args) {
           4         Timer timer = new Timer();
           5 
           6         for (int i = 0; i < 25; i++) {
           7             timer.reset();
           8             sum(100);
           9             System.out.println(i + "" + timer.getDuration());
          10         }
          11     }
          12 
          13     public static int sum(int n) {
          14         if (n <= 1)
          15             return 1;
          16         return n + sum(n - 1);
          17     }
          18 }

          上面的程序調用sum方法25次, 并記錄了每一次所用的時間, 運行結果是
          0: 0.1651047828704486
          1: 0.027936511484001458
          2: 0.014247620856840743
          3: 0.014247620856840743
          4: 0.013968255742000729
          5: 0.014247620856840743
          6: 0.014247620856840743
          7: 0.013968255742000729
          8: 0.013968255742000729
          9: 0.014247620856840743
          10: 0.014526985971680758
          11: 0.014247620856840743
          12: 0.014247620856840743
          13: 0.014247620856840743
          14: 0.39111116077602043
          15: 1.551035117591761
          16: 0.008101588330360423
          17: 0.007263492985840379
          18: 0.007542858100680393
          19: 0.007542858100680393
          20: 0.007263492985840379
          21: 0.007542858100680393
          22: 0.007542858100680393
          23: 0.007263492985840379
          24: 0.007263492985840379

          我們看到第14次的調用耗時突然增加了, 然后在第16次以后下降到14次以前的一半左右.

          這不是偶然的, 你可以多次運行這個程序, 每次你都會看到類似的結果.

          前面說當一段Java代碼運行的次數大于某個值時, 會被編譯成機器碼,這個值默認是1500次。而每個 sum(100) 回歸調用sum方法100次, 第14次的時候,sum正好被調用了1500次(從0開始計數)。也就是說第14次的時候激活了JVM去編譯sum方法,所以耗時突然增加,然后又減少。

          更進一步的證明是, 用 java -XX:+PrintCompilation JITDemo 來啟動程序,結果是
           ......
          12: 0.014247620856840743
          13: 0.014247620856840743
            7       cj.compiler.jit.JITDemo::sum (16 bytes)
          14: 0.8411683607832839
          ......
          紅色的行正好指示sum方法被編譯成機器碼。

          轉載請保留http://www.aygfsteel.com/xilaile/archive/2007/02/24/100445.html

          posted on 2007-02-24 00:05 gr8vyguy 閱讀(4454) 評論(1)  編輯  收藏 所屬分類: Java

          評論

          # re: 親身體驗JIT(Just in time compilation) 2007-02-28 05:10 liigo

          不錯,學習了。  回復  更多評論   

          <2007年2月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728123
          45678910

          導航

          統計

          公告

        1. 轉載請注明出處.
        2. msn: gr8vyguy at live.com
        3. 常用鏈接

          留言簿(9)

          隨筆分類(68)

          隨筆檔案(80)

          文章分類(1)

          My Open Source Projects

          搜索

          積分與排名

          最新評論

          主站蜘蛛池模板: 温泉县| 郁南县| 泰来县| 潢川县| 页游| 富锦市| 赤水市| 苍梧县| 吴忠市| 高要市| 株洲县| 舞钢市| 苏尼特左旗| 芜湖县| 台安县| 托里县| 上栗县| 乌苏市| 大田县| 元朗区| 瑞安市| 黔西县| 杂多县| 石城县| 武功县| 长治市| 婺源县| 汶上县| 小金县| 咸丰县| 堆龙德庆县| 桑植县| 永寿县| 习水县| 贵定县| 湖北省| 霍邱县| 沁阳市| 鹰潭市| 墨江| 丰都县|