Re: [问题] JIT 问题

楼主: mshockwave (夏克维夫)   2014-08-12 09:22:52
※ 引述《gn00618777 (非常念旧)》之铭言:
: ※ 引述《gn00618777 (非常念旧)》之铭言:
: : 我查询了网络上以及书本
: : 版本1: JIT是将source code 转换成 byte code之后,在程式执行期间
: : 再将byte code编译成机械码。
: : 版本2: 拥有JIT表示Dalvik将APP的byte code转换成二进制组合指令,那将
: : 以原生方式执行在目标的CPU上,而不是由VM一次解译一条指令。
: : 这两者,哪种比较对阿.....版本1说得好像就是执行期间,需要才编译成机械码。
: : 这和版本2是直接说"不是由VM一次解译一条指令"好像有点抵触,希望能为我解惑,
: : 谢谢。版本2出自于O'REILY翻译的书,我个人觉得翻译的好烂,前因后果要自己兜起来。
: 我还是不太懂版本二..
: "不是由VM一次解译一条指令",意思是说不是在执行中需要才编译?
: 是说JIT已经在执行前将APP byte code编译成机械码了吗?这样在执行前
: 是不是不用占用CPU来编译比较省电?
: 这是我的理解,希望有神人为我补充...谢谢。
.dex档是我们制作完app后打包进apk的东西
它基本上是java .class档的变形 为行动装置做过优化的一种byte code
是platform independent的
而在Android 2.2 Froyo之前完全没有JIT compiler的时候
dalvik vm 做的事就跟java vm 做的差不多
就是直译这些byte code
在有JIT之后 dalvik 每直译一条指令 会统计这条指令被直译的次数
如果次数多到超过门槛 就会把它编译成native code
也就是platform dependent的机器码了
它这种不是一次把整份byte code编成native code 因此叫做JIT(just-in-time)
而最近几年推出的Android ART就不是用JIT而是用AOT(ahead-of-time)
顾名思义就是在执行之前 就会把整份byte code编译成native code
而且跟JIT不同 它会把native code存成一个档案
虽然编玩的native code你用file指令下去看它会告诉你是一个ELF可执行档
但我上次把它dump出来看 基本上里面的区段都是android专用的
不可能独立执行
基本上下一个正式版本的android(没意外的话是今年秋天)就会把dalvik完全拿掉了
全换成ART
但就算是目前潮的滴水的Android L 内部runtime的转换仍属于阵痛期
例如编好的native code副档名仍叫.dex
还有就是用过Android L的朋友都知道 有用JNI且比较复杂的app几乎爆光光
因为ART对于JNI的检查特别严格 有些dalvik可以过的ART都不能
其实google很早就在官网说了 但就算Unity3D如此大公司都没有落实
用unity3d当引擎的游戏一开就闪退
糟了我是不是说很多不相关的事XD
希望有解答原po的疑问
作者: Y78 (Y78)   2014-08-12 10:50:00
作者: kewang (652公共汽车)   2014-08-12 13:14:00
这篇好文推!
作者: lovelycateye (我还想要更多力量)   2014-08-12 14:53:00
你知道的太多了...
作者: gn00618777 (非常念旧)   2014-08-12 15:11:00
推 太棒的文章了
作者: tac0wu (在BBS中流浪)   2014-08-13 00:51:00
感谢分享
作者: summerleaves (内湖全联先生)   2014-08-13 19:57:00
感谢分享

Links booklink

Contact Us: admin [ a t ] ucptt.com