JVM的编译及优化
2019-04-03 11:50:38 30 举报
AI智能生成
JVM的编译,javac做了什么,.class之后又做了什么,JVM又是如何提升程序的效率的
作者其他创作
大纲/内容
前端编译器
javac的过程
AOT编译器
把*.java编译成本地机器代码
后端编译器
解释器
JIT编译器(即时编译器)
C1
C2
javac做了什么?
javac编译器如何生成字节码?
解析与填充符号表
词法分析
语法分析
填充符号表
插入式注解处理器的注解处理过程
字节码的生成
语义分析
标注检查
检查语法是否正确
常量折叠
数据及控制流分析
生成字节码
解语法糖
生成字节码的代码优化
java语法糖的擦除
泛型与类型的擦除
自动装箱拆箱以及遍历循环
解释器
优缺点
优点:当程序快速启动时,解释器可以省去编译时间,立即执行
缺点:效率低
编译器
优缺点
优点:对热点代码进行提高效率,我们使用编译器将代码编译成本地机器码
缺点:占内存高
缺点:编译本地代码需要占用程序运行时间,要编译更高效的代码所花费的时间会更长
缺点:需要依赖解释器,由解释器收集性能监控等信息
C1(client Compiler)
C2(Server Compiler)
分层编译
第0层
程序解释执行,解释器不开启性能监控
第1层
C1编译,将字节码编译成本地代码,进行简单可靠的优化,并加入性能监控逻辑
第2层
C2编译,将字节码编译为本地代码,编译时间会唱,但会开启性能优化,还会根据性能监控进行不可靠的激进优化
热点代码
被多次调用的方法
基于采样的热点探测
基于计数器的热点探测(HotSpot所使用的)
被多次执行的循环体
回边计数器
虚拟机关于使用编译器的模式
混合模式(mixed mode)
编译模式(interpreted mode)
解释模式(comiled mode)
常见的编译优化方式
方法内联
方法创建是有成本的(如建立栈帧)
final的方法是实方法,不是final的都是虚方法
方法内联与虚方法的矛盾问题如何解决?JVM通过类型继承关系分析解决的
公共子表达式消除
如果一个表达式已经计算过了,就不再计算了
a * b 和 b * a 的含义是一样的,这时候就不需要再计算了
数组范围检查消除
如果可以判定一个数组的长度肯定会小于.length,就不用再去判断数组边界了
逃逸分析
为其它优化手段提供依据的技术
栈上分配:如果确定一个对象不会被这个方法以外所使用,那么,这个对象就在栈上分配,线程结束后,直接销毁占用的内存
同步消除:一段代码不是synchronized,就会把同步去掉
标量替换:将对象拆分成最小的元素,如果一个对象,经过逃逸分析辨别,这个对象只会用到它里面的一个变量或者常量,那就有可能不创建这个对象,而只创建这个变量或者常量
无用代码消除、循环表达式外提、空值消除、复写传播、基本块重排序等等
0 条评论
下一页