【JVM】运行期的优化

即时编译

解释器与编译器

Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code)。 为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler,简称JIT编译器)。

即时编译器与解释器的区别

  • 解释器是将字节码解释为机器码,下次即使再遇到相同的字节码,仍然会重复的进行解释
  • JIT是将一些字节码编译成机器码,并存储在Code Cache,下次再遇到相同的代码,直接执行,不需要再进行编译
  • 解释器将字节码解释为所有病态都通用的机器码
  • JIT会根据平台的类型,生成平台特定的机器码

在HotSpot虚拟机中,解释器与编译器共存,内置两个即时编译器,C1编译器和C2编译器。当程序需要迅速启动和执行时,解释器可以首先发挥作用,省去编译时间。当程序运行之后,编译器逐渐发挥作用,把越来越多的代码编译成本地代码,提高执行效率。

方法内联 

如果发现某个方法是热点方法,并且长度不太长的时候,会进行内联。所谓内联就是把方法的代码拷贝粘贴到调用者的位置“:

private static int square(final int i) {
       return i * i;
}
System.out.println(square(9));

如果发现aquare是热点方法,并且长度不会太长的时候,进行内联:

System.out.println(9*9);

再进一步优化就是:

System.out.println(81);

 

你可能感兴趣的:(JVM)