Android技术知识Android开发Android开发经验谈

Android面试 虚拟机相关

2022-03-17  本文已影响0人  一个有故事的程序员

面试问题

Jvm,Dalvik与Art三者之间的区别

JVM虚拟机与Android虚拟机区别:

  1. Dalvik下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这虽然会使安装过程比较快,但是会拖慢应用以后每次启动的效率。
  2. 而在ART 环境中,应用在第一次安装的时候,字节码就会预编译(AOT)成机器码,这样的话,虽然设备和应用的首次启动(安装慢了)会变慢,但是以后每次启动执行的时候,都可以直接运行,因此运行效率会提高。
  3. ART占用空间比Dalvik大(字节码变为机器码之后,可能会增加10%-20%),这也是著名的“空间换时间大法"。
  4. Art预编译也可以明显改善电池续航,因为应用程序每次运行时不用重复编译了,从而减少了 CPU 的使用频率,降低了能耗。

那dex和class到底在结构上有什么区别呢

  1. dex文件减少整体的文件尺寸 dex更像是一种压缩文件,一次可以表示更多的class。class像是一种单个文件。
  2. Android虚拟机加载类时 只对dex需要一次IO可以加载很多新类,而class需要加载多次IO,Android虚拟机提高查找速度。
  3. dex指令更加密集,class指令比较多。
  4. dex 寄存器设计方便寻址,class java栈需要更多次load与store指令。
  5. dex适合于移动设备,性能不太高的要求。class适合PC大内存,单指令小的情况下可以快速执行。

Android虚拟机中寄存器起什么作用,与栈的区别在哪里

看看现在的实际处理器,大多都是基于寄存器的架构,从侧面反映出它比基于栈的架构更优秀。
一般认为基于寄存器的架构对VM来说也是更快的,虽然没有地址(无变量声明)指令更紧凑,但完成操作需要更多的load/store指令,也意味着更多的指令分派(instruction dispatch)次数与内存访问次数;访问内存是执行速度的一个重要瓶颈,Android虚拟机的二地址或三地址指令虽然每条指令占的空间较多,但总体来说可以用更少的指令完成操作,指令分派与内存访问次数都较少。

Arm指令究竟是什么指令,能说说他与字节码指令的区别吗

  1. 字节码指令和Arm指令内容是不一样。
  2. arm指令是由arm公司开发的,指令含有地址,而字节码没有地址。
  3. 字节码指令是sun公司开发,简单高效。

为什么Art虚拟机比Dalvik虚拟机运行速度高

  1. 在Dalvik下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这虽然会使安装过程比较快,但是会拖慢应用以后每次启动的效率。而在ART 环境中,应用在第一次安装的时候,字节码就会预编译(AOT)成机器码,这样的话,虽然设备和应用的首次启动(安装慢了)会变慢,但是以后每次启动执行的时候,都可以直接运行,因此运行效率会提高。
  2. ART占用空间比Dalvik大(字节码变为机器码之后,可能会增加10%-20%),这也是著名的“空间换时间大法"。
  3. 预编译也可以明显改善电池续航,因为应用程序每次运行时不用重复编译了,从而减少了 CPU 的使用频率,降低了能耗。

表现结果:

更多内容戳这里(整理好的各种文集)

上一篇下一篇

猜你喜欢

热点阅读