栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Android虚拟机相关

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android虚拟机相关

1.0 为什么要学虚拟机

  1. 面试时 虚拟机是一个高频考点,非常容易考到,如果面试的好 是一个加分项

  2. 对虚拟机运行流程有一个深刻认知。这种认知为加深对APP运行机制的理解

  3. 对反编译,热修复,插件化有帮助,我们把dex理解了,能帮助我们理解其中原理

  4. 学习这些知识不能帮助到业务逻辑,但是他们加深你的视野。对原理的掌握翻译你的工作经验

1.1.1虚拟机连环炮系列 Jvm,Dalvik与Art三者之间的区别

面试心里分析(ppt)

分成两点来答(JVM虚拟机与Android虚拟机区别 , Art虚拟机与Dalvik虚拟机区别)

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

Android虚拟机执行的是.dex格式文件 jvm执行的是.class文件

class文件存在很多的冗余信息,dex工具会去除冗余信息

Android虚拟机是基于寄存器的虚拟机 而jvm执行是基于虚拟栈的虚拟机

1.2.3 Art虚拟机与Dalvik虚拟机区别

  1. Dalvik下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这虽然会使安装过程比较快,但是会拖慢应用以后每次启动的效率。

  2. 而在ART 环境中,应用在第一次安装的时候,字节码就会预编译(AOT)成机器码,这样的话,虽然设备和应用的首次启动(安装慢了)会变慢,但是以后每次启动执行的时候,都可以直接运行,因此运行效率会提高。

    典型的 空间换时间 128G --->apk

  3. ART占用空间比Dalvik大(字节码变为机器码之后,可能会增加10%-20%),这也是著名的“空间换时间大法"。

  4. Art预编译也可以明显改善电池续航,因为应用程序每次运行时不用重复编译了,从而减少了 CPU 的使用频率,降低了能耗。

1.2.1虚拟机连环炮系列 那dex和class到底在结构上有什么区别呢

心理分析:

面试官想考你对 dex文件编码结构了不了解。从侧面反映你是否做过热修复,dex加固方面反编译 的技术,这种技术一定对他们目前是非常重要的

总结

  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大内存,单指令小的情况下可以快速执行

1.4.1 Android虚拟机中寄存器起什么作用,与栈的区别在哪里(又或者基于栈与基于寄存器的架构,谁更快?)

面试心里分析

看看现在的实际处理器,大多都是基于寄存器的架构,从侧面反映出它比基于栈的架构更优秀。

一般认为基于寄存器的架构对VM来说也是更快的,

总结

原因是:虽然没有地址(无变量声明)指令更紧凑,但完成操作需要更多的load/store指令,也意味着更多的指令分派(instruction dispatch)次数与内存访问次数;访问内存是执行速度的一个重要瓶颈,二地址或三地址指令虽然每条指令占的空间较多,但总体来说可以用更少的指令完成操作,指令分派与内存访问次数都较少。

1.5.1虚拟机连环炮系列 Arm指令究竟是什么指令,能说说他与字节码指令的区别吗

面试心里分析

总结

字节码指令 和 Arm指令内容是不一样

如 同样一个 a+b

在 jvm的指令 iadd idiv imul

但是在dalvik指令是 add-int mul-int

arm指令是由arm公司开发的。 指令含有地址,而字节码指令没有地址

字节码指令是 sun公司开发,简单高效

总结

1.6.1虚拟机连环炮系列 为什么Art虚拟机比Dalvik虚拟机运行速度高

面试心里分析

总结

(1)在Dalvik下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这虽然会使安装过程比较快,但是会拖慢应用以后每次启动的效率。而在ART 环境中,应用在第一次安装的时候,字节码就会预编译(AOT)成机器码,这样的话,虽然设备和应用的首次启动(安装慢了)会变慢,但是以后每次启动执行的时候,都可以直接运行,因此运行效率会提高。

(2)ART占用空间比Dalvik大(字节码变为机器码之后,可能会增加10%-20%),这也是著名的“空间换时间大法"。

(3)预编译也可以明显改善电池续航,因为应用程序每次运行时不用重复编译了,从而减少了 CPU 的使用频率,降低了能耗。

表现结果

. 系统性能的显著提升

应用启动更快、运行更快、体验更流畅、触感反馈更及时

更长的电池续航能力

支持更低的硬件

1.7 课程用到的代码和指令

查看jvm字节码指令

javap -v -c -s -l Demo.class

查看dex 指令

dx --dex --verbose --dump-to=Demo.dex.txt --dump-method=Demo.foo --verbose-dump Demo.class

动画演示代码

public class  Demo { 
​
   public static int  foo() { 
   int a = 100; 
   int  b = 200; 
    return a+b;
  } 
​
} 

  1. public class Demo {

  2. public static void foo() {

  3. int a = 1;

  4. int b = 2;

  5. int c = (a + b) * 5;

  6. }

  7. }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/680935.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号