android平台解释器+JIT+AOT代码执行学习

dalvik JIT(Just-In-Time)

JIT即时编译,即在代码运行时进行编译。对于dalvik虚拟机而言其检测到执行频率较高的函数时就会进行jit编译将其编译为本地机器码,这样下次此函数执行的时候就会直接执行编译后的机器码,编译后的机器码只存在于内存中并不会以文件的形式保存,app重启后此函数依然会以解释模式执行,这种方式提高了程序在运行期间的执行效率。

art AOT(Ahead-Of-Time)

AOT事前编译,即在代码运行前进行编译。对于android 7.0之前的art虚拟机而言其会在apk安装的过程中利用dex2oat程序将apk中的dex文件编译为本地机器指令并保存为oat文件,这样在apk启动时直接加载此oat文件并运行,提高了程序了执行效率。但是因为他需要在apk安装的时候使用dex2oat程序进行编译,所以增加了apk在安装过程中的时间。

art JIT+AOT

因为android 7.0之前的art虚拟机在apk安装的过程中进行dex2oat编译增加了apk安装的时间,在android 7.0之后引入了JIT + AOT协同工作的模式。

JIT工作流程

  • 当dex文件/oat文件加载时ART虚拟机执行某个函数时会判断此函数是否被编译为了本地机器码。如果判断被编译为了本地机器码则会继续判断是否是JIT编译,如果是JIT编译的就去执行JIT编译产生的jit_code_cache本地机器码,如果不是JIT编译的说明是经过了AOT编译产生的本地机器码,进而去执行AOT编译产生的本地机器码。
  • 如果一开始就判断函数没有经过编译生成本地机器码就还去通过解释器interpreter执行其对应的机器码,如果在运行期间发现某个函数执行频率较高(热点函数)就通过JIT编译生成对应的本地机器码保存在jit_code_cache中,下次此函数再执行时就会执行jit_code_cache中的本地机器码。
  • 在JIT编译函数生成机器码的同时还会生成配置文件profile记录热点函数信息,供AOT守护进程使用编译生成oat文件

AOT守护进程编译生成oat文件

AOT守护进程会在设备空闲或者充电时定期生成oat文件,在生成oat文件的过程中会检查是否存在profile文件,如果存在profile文件就会将需要优化的函数编译成本地机器码。所以oat文件中并不一定就包含经过编译后的函数本地机器码,这取决于是否存在profile配置文件。

这样无论是首次安装时还是在运行时都能具有良好的效率。

java方法执行过程

总结java方法在JIT + AOT + interpreter中会有四种状态以及其对应在ArtMethod中的入口。

  1. 未经过任何优化的java方法,ArtMethod中对应的函数入口为art_point_from_interpreter,最后会执行对应的Java方法的codeItem。
  2. JIT编译的java方法,ArtMethod中对应的函数入口为entry_point_from_quick_compiled_code,最后会去执行jit_code_cache中JIT编译的本地机器码。
  3. AOT(dex2oat)编译的java方法,ArtMethod中对应的函数入口为entry_point_from_quick_compiled_code,最后会执行AOT生成的本地机器码。
  4. Native 属性的java方法,ArtMethod中对应的函数入口为entry_point_from_jni_(现在此字段更改为了data_),最后会执行navive方法对应在so中的本地机器码。

这些ArtMethod的入口是在java函数被LoadMethod加载后调用LinkCode中设置的,当然对于JIT编译的本地机器码肯定是在运行过程中设置的。

以上仅为个人学习观点,详细信息请参考官方文档:https://source.android.google.cn/docs/core/runtime/jit-compiler?hl=zh_cn

参考:
https://source.android.google.cn/docs/core/runtime/jit-compiler?hl=zh_cn
https://mp.weixin.qq.com/s?__biz=MzI3MDQ1NDE2OA==&mid=2247486912&idx=1&sn=211a370f0891806ebfb3dd09689c9fa1&chksm=ead19137dda6182114d2ae667520113ca1bbe4b302902dbc41725b2303a4b9fcaf31400b187f&mpshare=1&scene=23&srcid=0104SDV3bprY2lrP02G7J070&sharer_sharetime=1672889112714&sharer_shareid=79c8ff355b15a0d74f0b04425c497dfb#rd

posted @ 2023-01-05 16:50  怎么可以吃突突  阅读(1108)  评论(0编辑  收藏  举报