gr8vyguy@Blogjava

          親身體驗(yàn)JIT(Just in time compilation)

          JIT是Just in time compilation的縮寫, 是一種利用在運(yùn)行時(shí)將字節(jié)碼(Bytecode)翻譯為機(jī)器碼(Machine code),并保存在內(nèi)存中, 在后續(xù)的運(yùn)行中直接調(diào)用機(jī)器碼, 從而改善字節(jié)碼編譯語言性能的技術(shù)。JVM的Hotspot就是Java虛擬機(jī)中JIT的實(shí)現(xiàn).

          簡單的說,也就是當(dāng)一段代碼被運(yùn)行的次數(shù)大于某個(gè)值時(shí), 成為所謂的"Hot Spots", JVM就會(huì)把這段代碼編譯成機(jī)器碼. 通過下面的程序,我們將看到JVM的Hot Spot所起的作用. 程序中用到了一個(gè)高精度的Java計(jì)時(shí)器, 看我的另外一篇隨筆用JNI實(shí)現(xiàn)一個(gè)高精度的Java計(jì)時(shí)器.
           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 }

          上面的程序調(diào)用sum方法25次, 并記錄了每一次所用的時(shí)間, 運(yùn)行結(jié)果是
          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次的調(diào)用耗時(shí)突然增加了, 然后在第16次以后下降到14次以前的一半左右.

          這不是偶然的, 你可以多次運(yùn)行這個(gè)程序, 每次你都會(huì)看到類似的結(jié)果.

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

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

          轉(zhuǎn)載請保留http://www.aygfsteel.com/xilaile/archive/2007/02/24/100445.html

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

          評(píng)論

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

          不錯(cuò),學(xué)習(xí)了。  回復(fù)  更多評(píng)論   

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

          導(dǎo)航

          統(tǒng)計(jì)

          公告

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

          留言簿(9)

          隨筆分類(68)

          隨筆檔案(80)

          文章分類(1)

          My Open Source Projects

          搜索

          積分與排名

          最新評(píng)論

          主站蜘蛛池模板: 开化县| 喀什市| 通许县| 罗城| 临桂县| 昌图县| 汶上县| 唐河县| 临泽县| 陵川县| 土默特右旗| 仲巴县| 彩票| 寻甸| 南开区| 娱乐| 耿马| 关岭| 奎屯市| 阿克苏市| 类乌齐县| 陆川县| 逊克县| 青冈县| 乌兰县| 炎陵县| 双鸭山市| 麟游县| 景洪市| 青阳县| 汉沽区| 鄱阳县| 西宁市| 常熟市| 潮安县| 仁布县| 拉萨市| 平安县| 咸阳市| 子洲县| 神木县|