1.5 KiB
1.5 KiB
优劣得失
有两种研究方向研究方向: 一种是做与传统 C、C++编译器类似把程序代码翻译为机器码的静态翻译工作, 另一种是把原本即时编译器在运行时要做的编译工作做好提前保存下来,下次运行直接加载
传统的提前编译应用形式, 最大弱点: 即时编译器要占用程序运行时间和运算资源
第二种是给即时编译器做缓存加速,改善 Java 程序启动时间,以及需要一段时间预热才能达到最高性能的问题。 这种提前编译被称为动态提前编译,或即时编译缓存
Jaotc 提前编译器, 是一个基于 Graal 编译器实现的新工具, 可以让用户针对目标机器,为应用程序进行提前编译, HotSpot 运行时可以直接加载这些编译的结果, 加快程序启动速度,减少程序达到全速运行状态的时间
即时编译器对于提前编译器的天然优势
- 性能分析制导优化 解释器或客户端编译器在运行过程中,会不断收集性能监控信息 这些数据在静态分析时无法得到, 动态运行时可以看出有明显的偏好性, 可以热的代码集中放一起,集中优化和分配更好的资源(分支预测、寄存器、缓存)
- 激进预测性优化 即时编译器可以在一些可能性很大但无法保证完全正确的假设进行优化, 走到罕见分支也可以回退,不会无法挽回
- 链接时优化 Java 是动态链接的,可以做到跨越动态链接库的方法内联