12、jvm运行期优化
运行期优化:
jvm将执行状态分成五个层次
(1)0层,解释执行(Inrerpreter)
(2)1层,使用c1即时编译器编译执行(不带profiling)
- 2层,使用c1即时编译器编译执行(带基本的prodiling)
- 3层,使用c1即时编译器编译执行(带完全的profiling)
- 4层,使用c2即时编译器编译执行
profiling是指在运行过程中收集一些程序执行状态的数据,例如:方法调用次数,循环的回边次数等
即时编译器(JIT)与解释器的区别
- 解释器是将字节码解释为机器码,下次即时遇到相同的字节码,仍会执行重复的解释
- JIT是将一些字节码编译为字节码,并存入Code Cache,下次遇到相同的代码,直接执行,无需再编译
- 解释器是将字节码解释为针对所有平台都通用的机器码
- JIT会根据平台类型,生成平台特定的机器码
对于占据大部分的不会常用的代码,我们无需耗费时间将其编译成机器码,而是采取解释执行的方式运行,另一方面,对于占据小部分的热点代码,我们则可以将其编译成机器码,以达到理想的运行速度。执行效率简单比较一下Interpreter<c1<c2,总的目标就是发现热点代码(hostpot名称的由来),
-
- 分层编译
- 逃逸分析
- 方法内联:如果发现是热点方法,并且长度不会太长,会进行内联,所谓内联就是把方法内代码拷贝,粘贴到调用者的位置
- 字段优化