实战Java虚拟机之五“开启JIT编译”

转载请注明出处,感谢大家的支持!
本文来自优优码:http://www.uucode.net/201504/jvm5

今天开始实战Java虚拟机之五“开启JIT编译”。

总计有5个系列

Java虚拟机有3种执行方式,分别是解释执行、混合模式和编译执行,默认情况下处于混合模式中。使用命令行java –version可以查看虚拟机的执行模式:

C:\Users\Administrator>java -version

java version “1.7.0_13″

Java(TM) SE Runtime Environment (build 1.7.0_13-b20)

Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)

上面输出的“mixed mode”就表示混合模式。在混合模式中,部分函数会被解释执行,部分可能被编译执行。虚拟机决定函数是否需要编译执行的依据是判断该函数,是否为热点代码。如果函数的调用频率很高,被反复使用,那么就会被认为是热点,热点代码就会被编译执行。

解释执行模式表示全部代码均解释执行,不做任何JIT编译,可以使用参数-Xint来开启解释执行模式:

C:\Users\Administrator>java -Xint -version

java version “1.7.0_13″

Java(TM) SE Runtime Environment (build 1.7.0_13-b20)

Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, interpreted mode)

编译执行模式和解释执行模式相反,对于所有的函数,无论是否是热点代码,都会被编译执行,使用参数-Xcomp可以设置为编译模式:

C:\Users\Administrator>java -Xcomp -version

java version “1.7.0_13″

Java(TM) SE Runtime Environment (build 1.7.0_13-b20)

Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, compiled mode)

一般来说,编译模式的执行效率会远远高于解释模式。更多的示例参考《实战Java虚拟机》一书。

【示例11-36】下面的代码不停计算圆周率的数值,并给出了运行的耗时:

public static double calcPi(){

         double re=0;

         for(int i=1;i<10000;i++){

                   re+=((i&1)==0?-1:1)*1.0/(2*i-1);

         }

         return re*4;

}

public static void main(String[] args) {

         long b=System.currentTimeMillis();

         for(int i=0;i<10000;i++)

                   calcPi();            

         long e=System.currentTimeMillis();

         System.out.println(“spend:”+(e-b)+”ms”);

}

使用虚拟机参数-Xint运行以上代码,输出:

spend:2794ms

使用虚拟机参数-Xcomp运行以上代码,输出:

spend:1082ms

很明显,在本例中使用编译运行要比解释运行快大约3倍。

《实战Java虚拟机》一书Q交流群:397196583

25612fm立体图

发表评论

您的电子邮件地址将不会被公开. 必填昵称和邮箱 *

*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

你必须启用javascript
滚动到顶部
备案号:浙ICP备08112675号-4 浙公网安备 33010502001953号