缺点:
- 执行速度稍慢
- 完成相同功能所需的指令熟练多
Javac编译过程分为哪些步骤?
- 解析与填充符号表
- 插入式注解处理器的注解处理
- 分析与字节码生成

文章插图
什么是即时编译器?Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁,就会把这些代码认定为“热点代码”(Hot Spot Code) 。
为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器成为即时编译器(Just In Time Compiler,JIT编译器) 。
解释器和编译器许多主流的商用虚拟机,都同时包含解释器和编译器 。
- 当程序需要快速启动和执行时,解释器首先发挥作用,省去编译的时间,立即执行 。
- 当程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码,可以提高执行效率 。

文章插图
为什么要采用分层编译?因为即时编译器编译本地代码需要占用程序运行时间,要编译出优化程度更高的代码,所花费的时间越长 。
分层编译器有哪些层次?分层编译根据编译器编译、优化的规模和耗时,划分不同的编译层次,包括:
- 第0层:程序解释执行,解释器不开启性能监控功能,可出发第1层编译 。
- 第1层:也成为C1编译,将字节码编译为本地代码,进行简单可靠的优化,如有必要加入性能监控的逻辑 。
- 第2层:也成为C2编译,也是将字节码编译为本地代码,但是会启用一些编译耗时较长的优化,甚至会根据性能监控信息进行一些不可靠的激进优化 。
编译对象与触发条件热点代码有哪些?
- 被多次调用的方法
- 被多次执行的循环体
- 基于采样的热点探测,虚拟机周期性检查各个线程的栈顶,如果发现某个方法经常出现在栈顶,那这个方法就是“热点方法” 。实现简单高效,但是很难精确确认一个方法的热度 。
- 基于计数器的热点探测,虚拟机会为每个方法建立计数器,统计方法的执行次数,如果执行次数超过一定的阈值,就认为它是热点方法 。
- 方法调用计数器
- 回边计数器(判断循环代码)
有哪些经典的优化技术(即时编译器)?
经验总结扩展阅读
- JVM学习笔记——类加载和字节码技术篇
- 详解pyautogui模块
- 2022-11-4 VideoPipe可视化视频结构化框架新增功能详解
- 详细了解JVM运行时内存
- 【JVM】关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列
- Istio Ambient Mesh七层服务治理图文详解
- JVM学习笔记——垃圾回收篇
- 详解AQS中的condition源码原理
- JVM学习笔记——内存结构篇
- FHQ Treap 详解