java:.java文件编译成.class文件的字节码,最终将字节码提供给jvm翻译成机器码。
android:.java文件转换成.dex文件的字节码,dex通过ART或Dalvik runtime 转换成机器码。
android的最早的虚拟机是Dalvik(5.0之后被ART取代),Dalvik是采用JIT编译的(Just-in-time),ART采用AOT编译(Ahead-of-time)。
JIT编译:在每次应用运行时,它将部分字节码翻译成机器码,在程序的执行过程中,编译更多的代码。由于每次只执行一部分,所以消耗更少的内存和物理地址,但有个弱点是每次都在启动时编译,所以在速度上会变慢。由于编译要用到cpu,所以会占用更多的cpu资源,耗电也更高。
AOT编译:在应用首次安装的时候,就将dex字节码翻译成机器码,并存储在本地中,所以应用启动时就不用在编译直接加载机器码,所以在速度上会很快,但是因为要在本地存储,所以要花费更多的存储空间,而且安装的时间长。用的cpu资源少,耗电更低。
ART:刚开始时只用AOT编译的,后来在android7.0之后用AOT和JIT相结合编译。
jvm和dvm的区别可参考最后
1.dalvik是android专门的虚拟机,每个应用启动时都有一个专门的虚拟机,每个虚拟机都是独立的Linux进程,所以在虚拟机崩溃的时候不会影响全部应用都关闭,dalvik是基本cpu工作,所以它可以在有限的内存中运行多个程序,且速度快。
2.dalvik支持已转换为.dex格式的ava应用程序的运行(DalvikExecutable),.dex会预先把.jar文件里面的.class文件存放到.dex并做了一些无用信息的删减,适合内存和处理器速度有限的系统。
1.ART,与dalvik不同的是,dalvik是把文件变得好编译,而ART是在apk在首次安装的时候把dex文件直接翻译成本地机器指令,以后打开应用的时候直接用机器指令,省去翻译的过程
2.ART的运行时间快,但占用的内训大,典型的用空间换时间
3.dalvik都是先编译在运行,ART只会在首次安装时编译
网友评论