1)JIT编译

以最新的java JIT为例, JIT编译器默认情况下处于启用状态,并在调用Java方法时被**。

JIT编译对比AOT编译(附图片)

JIT编译器将需要执行的方法(或代码片段)的字节码,做一个count计数,如果被调用的count计数超过了一个阈值,则解释器会把这个方法(或代码片段)的字节码编译为本地机器代码,顺手缓存并添加索引,完后直接交给cpu运行。编译并索引了该方法(或代码片段)后,JVM下次执行它的时候会直接找到并调用该方法已编译的本地机器代码,而不是对其进行逐行解释为本地机器码再一一交给cpu执行了。

注意到JIT中涉及到的统计,编译和缓存都是在程序运行时进行的,所以该编译被称作为just in time编译。

那么能不能把这些都放在程序运行之前,来进一步提升执行效率呢? 答案是肯定的。

2)AOT编译

java9就已经开始支持AOT编译了,你只需要把一个字节码文件把交给编译器,它就可以在执行之前编译成so文件,

在真正执行程序的时候,只需要把这个编译好的so文件配置成AOT库,就可以了。如下图:

JIT编译对比AOT编译(附图片)

随之而来的缺点也就出现了,那就是AOT之后的程序不再支持跨平台了,所以使用时还需要进行性能和兼容性的权衡才好。

JIT编译对比AOT编译(附图片)

 

相关文章:

  • 2022-12-23
  • 2021-11-06
  • 2022-02-09
  • 2021-05-23
猜你喜欢
  • 2021-11-18
  • 2021-11-13
  • 2021-08-25
  • 2022-12-23
  • 2021-06-18
  • 2021-12-14
相关资源
相似解决方案