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.3911111607760204315: 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.tkk7.com/xilaile/archive/2007/02/24/100445.html