赞
踩
Android虚拟机中JIT的使用
Android ART虚拟机中,通过使用JIT与AOT相互配合,在应用程序的安装和运行阶段进行优化
Android DMV虚拟机和早期ART虚拟机的问题
Android DVM虚拟机在应用程序每次运行时,字节码都要经常JIT即时编译器编译为机器码。而ART虚拟机早期,系统在安装应用程序的时候会进行一次AOT(预编译),将字节码转换为机器码存在本地,虽然这样不用每次运行时都进行编译,但是使用AOT的方式,会导致安装过程变得很慢。
ART虚拟机加入JIT之后
所以在Android7.0时,加入了JIT即时编译器,作为AOT的一个补充,应用程序在安装时,只会将热点代码编译成机器码存在本地,缩短应用程序安装时间节省存储空间。改变了之前在安装的时候的AOT预先编译的方式,不在安装的时候进行编译机器码,AOT只是用来编译JIT热点代码文件,编译成机器码,在下次使用时就可以直接使用。直接编译成机器码之后,应用在运行过程中,就可以直接加载机器码代码,直接运行,而不需要再去从dex寻找对应的.class进行加载
在Android7.0,ART使用了运行时编译JIT,而在运行时编译的时候,还有使用了AOT,在运行前编译,代码在执行期间,会收集热点代码,热点代码会通过JIT即时编译器编译成对应的文件保存在jit code cache,在设备空闲时或者充电时,AOT仅仅编译这部分热点代码文件,剩下的非热点代码依然是在运行时编译。
新的ART在安装程序时使用JIT,在JIT编译了一些代码后将这些代码保存到本地,等到设备空闲的时候将保存的这些代码使用AOT编译生成可执行文件保存到本地,待下次运行时直接使用,并且不断监视代码的更新,在代码有更新后重新生成可执行文件。
这样的话,热点代码是已经预编译好了,就不会被普通的热修复方案给修复,因为热点代码没有在运行时加载,这样的话,修复的代码并不会被重新加载,其实就是没有修复了。所以需要自定义一个ClassLoader来重新加载后续的所有类,来达到cache无用化的效果。
总结
最初安装应用时不进行任何 AOT 编译(安装又快了),运行过程中解释执行,对经常执行的方法进行JIT,经过 JIT 编译的方法将会记录到Profile配置文件中。
当设备闲置和充电时,编译守护进程会运行,根据Profile文件对常用代码进行 AOT 编译。待下次运行时直接使用。
这样的做法,在首次运行的时候,并不如Android7.0之前的做法,但是跑的多了,就会记录更多的热点代码,然后由AOT进行编译,这样就减少了编译执行的地方,这样在执行的时候,执行次数越多,编译执行的地方就更少了,这样就变快了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。