dex编译相关:JIT、AOT

前言

  在android的源码中看到了jit相关的代码,感觉jit这词儿有点儿眼熟,就查了一下其相关资料,顺带了解了一下android dex编译技术的变迁史。下面是总结,以问题为引导来说。

总结

  什么是JIT ?

  JIT,即“Just In Time”,翻译过来就是“即时编译技术”。android在2.2版本引入此技术,主要是用来提高程序的执行效率的。既然是编译技术,那它具体编译的是什么?又是什么时候执行此操作的?JIT是在程序运行期间执行,可将java字节码编译成机器码,将java指令编译成cpu可执行的微处理器指令。

  那它又是怎么提高程序的执行效率的?2.2版本之前的android在程序运行时,代码的执行都需要先通过解释器将字节码转换成机器码,而引入了JIT后,对于会多次执行到的代码(比如某个类的函数、某一个经常使用到的执行路径相关的代码,就是所谓的“热点函数”、“热点trace”),JIT会将其编译成机器码。下次再执行此代码时就直接执行机器码,从而提高了代码的执行效率。

  为什么只是对热点函数、热点trace进行JIT编译,而不是全部的字节码?首先,字节码的大部分代码一般不会总是执行到(即执行频率低),而JIT是在程序运行期间编译,编译时又需要时间,在程序运行期间花时间编译一般不会执行到的代码,这不是一个好的选择。所以,JIT只编译热点函数、热点trace,对于非热点的代码仍旧在用到时用解释器去解释成机器码然后执行就可以了。

  还有一个点,JIT编译而来的机器码是存储到内存中的,不是在硬盘上。所以,在应用重新启动时,所有的热点代码也都需要使用jit重新编译成机器码。

  网上找到一段关于JIT在代码层面实现逻辑的说明,个人认为很好:“每启动一个应用程序,都会相应地启动一个dalvik虚拟机,启动时会建立JIT线程,一直在后台运行。当某段代码被调用时,虚拟机会判断它是否需要编译成机器码,如果需要,就做一个标记,JIT线程不断判断此标记,如果发现被设定就把它编译成机器码,并将其机器码地址及相关信息放入entry table中,下次执行到此就跳到机器码段执行,而不再解释执行,从而提高速度”。

  JIT是Dalvik虚拟机下的编译模式,随着ART在4.4版本之后替代Dalvik,编译模式也由JIT变为了AOT(4.4版本JIT)。

小结:

  • Dalvik从android诞生时就存在,4.4版本之后被ART替代
  • JIT在android 2.2版本被引入,4.4版本之后被AOT替代
  • JIT只是对热点函数、热点trace进行编译,非热点函数还是走解释器
  • JIT编译生成的机器码存储在内存中,应用下次启动时需重新编译热点代码
  什么是AOT?

  AOT,即“Ahead Of Time”,翻译过来就是“预编译”。这个技术在4.4版本上就可以使用了,是ART的编译模式。为什么叫“预编译”?因为它是在应用安装时就将字节码编译成了机器码然后存放在本地(可以理解为“硬盘”)了。这样程序运行时就可以直接从本地取到机器码然后执行,大大提高了代码的执行效率。

  JIT会在程序运行期间进行编译,执行效率并没有理论上那么高。而AOT直接在应用安装时就编译了,无需在程序运行期间编译,这是AOT的一个优势。但它也有弊端,比如说应用安装时就编译,会导致应用包安装的时间变长;编译的机器码存到了本地,就会导致应用占用的本地存储空间多了代码包的20%左右。

  AOT作为默认的编译模式,也只是在android 5.x、6.x版本,7.0版本开始使用混合模式。

小结:

  • AOT,是在应用安装时编译,优点是省去了在程序运行期间的编译时间,提高了代码的执行效率
  • AOT,也印在应用安装时编译,延长了应用的安装时间,增大了本地存储空间的占用
  • AOT作为默认编译模式,只存在于android 5.x、6.x版本
  android 7.0及之后的编译模式是怎样的?

  7.0版本采用的是hybird的模式,也就是JIT+AOT+解释器的结合。应用安装时不再编译,直接安装。代码执行时采用JIT的方式,对于热点trace和热点代码进行编译并产生profile文件,但这种JIT产生的编译不是持久化的。当手机进入空置或者充电状态时,系统隔一段时间就扫描一下app的profile文件,基于此profile文件制定的热点trace或者热点代码进行编译并进行持久化处理。待应用再次运行时,如本地有相关机器码,就直接运行本地的机器码而不再进行JIT编译。

  此处的AOT,不再指“Ahead Of Time”,而是指“All Of the Time”。

  这种混合模式的好处是,因为不再进行安装时编译,安装会变得很快;在空置或充电等状态下进行了编译,编译过的热点代码或热点trace不会再进行重复编译,执行效率也会提升。缺点是,应用前几次代码执行,效率可能一般;用户操作应用的次数越多,这种代码执行的效率越明显。

参考资料:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350