浅谈JIT&AOT

这是一篇给自己脑补的笔记!

想必很多Android用户已经在自己各种设备上使用Android L了。自己年初在淘宝上¥1200进了nexus5,系统早早的升级到Android L,不得不说Nexus是一个非常非常棒的手机。

Android L与之前Android KK的对比,Dalvik虚拟机已经在L中移除,ART(Android run time)在kk的时候作为Optional,现在已经正式代替Dalvik。讲到这些转变的时候,疑问就来了而且还根本停不下来,我不知道Dalvik之前是怎么做的,Java于我只是大学一个学期的课程,Java虚拟机,我当时在课堂上绞尽脑汁也想不出一个具体样子出来,然后浑浑噩噩,大学就过去了,好吧我想知道java在传统JVM中是如何运行的,在DVM中又是如何运行的,什么是dex,什么是odex,什么是JIT,什么是AOT,什么是oat,什么是ART...?有时想想,想这么多真的好嘛!?不过没办法,有时脑子蹦蹦出来这么多疑问,实在憋不下去就会觉得有必要抽个时间脑补一下。

dex

本质上java文件编译后都是字节码ByteCode,不管是传统的JVM,还是Google Dalvik DVM。只是这两种虚拟机环境下ByteCode有所差异,最直观的是在JVM运行的是.class文件,而DVM是.dex文件,DVM专门对移动操作系统(尤其是Android)的特性进行了优化,并且DVM的设计是基于寄存器的,指令集有非常大的不同(具体未研究),还有等等等等...,好吧,到这步,了解到.dex是字节码,至于dex文件format构成,脑补阶段暂时略过吧XD~~。

JIT

接下来Android2.2的时候引入了JIT(JUST-IN-TIME)技术,JIT技术准确来讲应该是JIT Compiler,那JIT之前是怎么一回事?最早的时候,java是由解释器(Interpreter),将每个java指令转译为对等的微处理器指令,并根据转译后的指令先后次序依序执行,一个java指令可能对应十几或者几十个对等微处理指令,运行的时候还要先解释,在硬件条件差的情况下,执行速度是可想而知有多慢的。为了解决这个问题,JIT就来了,当java执行runtime环境时,每遇到一个class,JIT就会对这个类进行编译,生成相当精简的二进制码,花费少许的编译时间来换取后续的执行速率,这个效率提高还是比较大的,但这并没有达到顶尖的效能,因为某些java文件是极少执行的,编译它们的时间有可能远远长于转译器转译执行的时间,整体下来,花费的时间并没有减少。基于JIT的经验,又出来了动态编译器(dynamic compiler),动态预判哪些需要compile哪些需要转译,所以动态编译器是既包含了转译器&编译器的。尚不确定Android的JIT技术是否为这种dynamic compiler。另外,说到这里,我们第一次执行APP速度慢一些应该是因为在做一些Compile的动作,如果说得不对,还请指正。google当时说,JIT技术的引入速度提升3-5倍,后来发现我们华丽丽的又被骗了。

Odex

讲了dex、JIT,接下来讲讲Odex,Odex即Optimize Dex对dex文件的优化,最直观的好处:

  • deodex在系统第一次开机时,需要提取所有apk里的dex文件,而odex优化是提前提取出来了,开机速度&运行速度都有提高。
  • Odex优化后,APK里可以没有dex文件,而未Odex在APK包里有一份dex文件,在/data/dalvik-cache下还有提取出来的一份,浪费存储空间。
  • 一定程度上保护了厂商自己的APK,因为apk里只有资源文件,反汇编没有意义,直接拷贝到别处无法安装运行...。

AOT

技术随着时间之轮毫不停歇前行。Android kitkat 4.4,新的Android Runtime(ART)出现了,做为一个可选项,供一些愿意的用户测试使用,当然这个时候Dalvik还是作为默认的虚拟机环境。ART采取了AOT(Ahead-Of-Time)技术,简单一点理解就是,在APK安装的时候就会做预先编译动作,编译好的文件是OAT文件,该文件本质上是一个ELF文件,这里与dex(Odex)文件最大的区别是OAT文件不再是字节码文件,而是一个可执行文件,可以更底层的与硬件接触,运行时也省去了预编译和转译的时间。在Android L中我们找不到OAT文件,其实oat文件依旧以.odex作为后缀,通过file命令或者UE打开可以看到ELF头部。另外ART设计是考虑兼容性的,即在Dalvik可以运行的APP,在系统升级到5.0、5.1(Dalvik->ART)这些APP依旧可以运行,这个是通过dex2oat做到的,dalvik下的dex、odex文件均可以通过这个工具转化为oat文件,并且odex文件将比dex文件编译的更快。

脑补暂告一段落,欢迎客官拍砖、指正。

References:

http://www.importnew.com/596.html
http://bbs.mfunz.com/thread-1007717-1-1.html
http://source.android.com/devices/tech/dalvik/configure.html
http://source.android.com/devices/tech/dalvik/index.html
http://www.th7.cn/Program/Android/201401/168089.shtml



转载:https://www.jianshu.com/p/ac079e7fc412

### JIT (Just-In-Time) 和 AOT (Ahead-Of-Time) 编译的差异及特点 #### 差异分析 JIT 和 AOT 是两种不同的编译方式,在编译时机、覆盖范围、启动性能和优化潜力等方面存在显著差异: 1. **编译时机** - JIT 编译发生在程序运行期间,仅当某些代码被频繁调用时才会触发编译过程[^4]。这种按需编译的方式能够集中资源于热点代码上。 - AOT 则是在程序运行之前完成整个代码的编译工作,生成可以直接执行的机器码[^1]。 2. **覆盖范围** - JIT 主要针对程序中的热点代码进行编译优化,而非对所有代码进行全面处理[^2]。这种方式有助于节省计算资源并提高效率。 - AOT 对应的是全量编译模式,即将源代码一次性转化为目标平台上的原生二进制文件[^1]。 3. **启动性能** - 使用 AOT 技术后应用可以实现快速冷启动,因为它省去了传统解释型语言所需的即时翻译环节[^1]。 - 相反,由于 JIT 需要在首次加载模块或者函数时先经过一段解析阶段再逐步转为本地指令形式,因此它的初次响应速度相对较慢[^4]。 4. **优化潜力** - 在实际操作过程中,JIT 能够依据当前系统的状态调整参数设置从而达到更好的效果;比如它可以识别哪些部分正在被执行得多,并据此作出相应的改进措施来获得更高的执行效能[^2]。 - 尽管如此,AOT 缺乏足够的灵活性去适应特定条件下的变化需求,这意味着它可能无法充分利用那些唯有在运行时刻才可获取的信息来进行深层次定制化改造。 #### 特点总结 ##### JIT 的特性 - 提供较高的吞吐能力,尤其适合长时间持续工作的服务器端软件; - 动态生成新代码的能力使其非常适合复杂逻辑运算密集型任务; - 不过也存在着较长初始化延迟的问题,这使得它们不太理想用于短生命周期的应用场合如移动设备上的轻量化服务等情形之下。 ##### AOT 的特性 - 显著缩短了应用程序从安装到可用之间的时间间隔,这对于强调瞬时反馈体验的产品尤为重要; - 减少了对于额外虚拟机环境的支持依赖程度,进而降低了整体内存消耗水平; - 然而缺乏实时数据驱动下的精细化调控手段,则限制住了其进一步挖掘潜在效益的空间大小。 ```java // 示例:使用 GraalVM 执行 AOT 编译后的 Java 应用程序 public class HelloWorld { public static void main(String[] args){ System.out.println("Hello, this is an AOT compiled program!"); } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值