即时编译器(Just In Time Compiler)为了提高执行效率将热点代码编译成与本地平台相关的机器码,并进行各种层次的优化的编译器。它并不是虚拟机必需的部分,但其性能的好坏、代码优化程度的高低却是衡量一款商用虚拟机优秀与否的最关键指标之一,也是虚拟机中最核心且最能体现虚拟机技术水平的部分。
HotSpot虚拟机内的即时编译器
HotSpot虚拟机内同时包含解释器与编译器,两者各有优势。优势体现如下:
1、当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行;在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。
2、当程序运行环境中内存资源限制较大,可以使用解释执行节约内存,反之可以使用编译执行来提升效率。
3、解释器还可以作为编译器激进优化时的一个“逃生门”,让编译器根据概率选择一些大多数时候都能提升运行速度的优化手段。
编译优化技术
编译优化技术的代码优化变换是建立在代码的某种中间表示或机器码之上,绝不是建立在java源码之上的。最有代表性的优化技术如下:
1、公共子表达式消除:如果一个表达式E已经计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为了公共子表达式。
2、数组边界检查消除:java语言是一门动态安全的语言,每次对数组的读写访问时都会执行数组是否越界检查。
3、方法内联:可以消除方法调用的成本,为其他优化手段建立良好的基础
4、逃逸分析:目前java虚拟机中比较前沿的优化技术,不是直接优化代码,只为其他优化手段提供依据的分析技术。其基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,称为逃逸。甚至还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸。