解释器
优缺点
优点:当程序快速启动时,解释器可以省去编译时间,立即执行
缺点:效率低
编译器
优缺点
优点:对热点代码进行提高效率,我们使用编译器将代码编译成本地机器码
缺点:占内存高
缺点:编译本地代码需要占用程序运行时间,要编译更高效的代码所花费的时间会更长
缺点:需要依赖解释器,由解释器收集性能监控等信息
C1(client Compiler)
C2(Server Compiler)
分层编译
第1层
C1编译,将字节码编译成本地代码,进行简单可靠的优化,并加入性能监控逻辑
第2层
C2编译,将字节码编译为本地代码,编译时间会唱,但会开启性能优化,还会根据性能监控进行不可靠的激进优化
热点代码
被多次调用的方法
基于采样的热点探测
基于计数器的热点探测(HotSpot所使用的)
常见的编译优化方式
方法内联
方法创建是有成本的(如建立栈帧)
final的方法是实方法,不是final的都是虚方法
方法内联与虚方法的矛盾问题如何解决?JVM通过类型继承关系分析解决的
公共子表达式消除
如果一个表达式已经计算过了,就不再计算了
a * b 和 b * a 的含义是一样的,这时候就不需要再计算了
数组范围检查消除
如果可以判定一个数组的长度肯定会小于.length,就不用再去判断数组边界了
逃逸分析
为其它优化手段提供依据的技术
栈上分配:如果确定一个对象不会被这个方法以外所使用,那么,这个对象就在栈上分配,线程结束后,直接销毁占用的内存
同步消除:一段代码不是synchronized,就会把同步去掉
标量替换:将对象拆分成最小的元素,如果一个对象,经过逃逸分析辨别,这个对象只会用到它里面的一个变量或者常量,那就有可能不创建这个对象,而只创建这个变量或者常量
无用代码消除、循环表达式外提、空值消除、复写传播、基本块重排序等等