名词解释:
JIT(JUST - IN -TIME)实时编译
AOT(AHEAD-OF-TIME)预先编译
它们两者最根本的区别,就在于编译代码的时机,所谓的编译代码,就是把人类写的代码,翻译成机器字节码指令这么一个过程。
优缺点:
JIT优点:
1·可以实时根据硬件资源情况实时编译生成最优指令。
2·能实现动态链接,动态编译加载需要用到的模块代码,节省内存空间
3·能通过程序运行中内存和磁盘空间使用率情况,定位代码优化点(这是AOT无法做到的)
JIT缺点:
1·边运行边编译,会造成进程的卡顿,编译的同时收集编译信息,虽然会进行动态优化(例如热点代码热点方法等),但是会占用更多的内存资源
2·第一次编译运行时候较慢
方法内联:
假设一个方法checkUser,每一个接口都需要调用,用于校验身份和权限,按照方法的入栈出栈,这个方法会被每一个工作线程不停压入自己的私有栈中,执行完该方法后,再跳转回上一个方法,这样性能不高,而JIT优化中的一点方法内联,则支持将该方法代码复制到调用方法中,从而避免发生真实的方法调用,也就是checkUser的代码过来就好,它自身不要压进来。而JIT要实现这一点优化,很明显要有个地方保存类似“方法编译记录”之类的缓存,而这也可以理解为什么JIT更加占用内存以及支持更高的吞吐量
AOT优点:
1·程序运行前就编译完成,使得编译工作不会占用运行时资源,程序运行更加流畅
2·由于所有代码模块都已经预先编译完成,首次运行的性能表现较优异
AOT缺点:
1·程序更新和重新加载非常缓慢
2·模块代码统一编译打包了,不具备动态编译的优化,没有运行时的动态性能加成
参考一张百度图片
可以总结出:
AOT启动速度Startup Speed 占优,更低的内存占用,更小的打包
JIT峰值吞吐量Peak Throughput比较高,能减少延迟Reduced Max Latency
由于Java的跨平台性,能运行在多种安装了JRE环境的系统中,所以被很多终端应用选作为开发语言,而这也是Java9为了提高Java的性能,推出了AOT的原因。
各自的用途:
AOT适合客户端APP之类
JIT适合服务器端
怎么用?
看项目部署时候选择的对应的编译器,不同JDK版本不同的JVM虚拟机自带的编译器不同,或者通过配置也能修改编译方式的不同
这里另外一个博主的尝鲜教程:https://blog.csdn.net/weixin_39837867/article/details/114402561