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.blogjava.net/xilaile/archive/2007/02/24/100445.html

posted on 2007-02-24 00:05 gr8vyguy 阅读(4443) 评论(1)  编辑  收藏 所属分类: Java

评论

# re: 亲身体验JIT(Just in time compilation) 2007-02-28 05:10 liigo

不错,学习了。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2007年2月>
28293031123
45678910
11121314151617
18192021222324
25262728123
45678910

导航

统计

公告

  • 转载请注明出处.
  • msn: gr8vyguy at live.com
  • 常用链接

    留言簿(9)

    随笔分类(68)

    随笔档案(80)

    文章分类(1)

    My Open Source Projects

    搜索

    积分与排名

    最新评论