首页 > 编程知识 正文

android算法面试题,android开发遇到的技术难点

时间:2023-05-05 01:54:22 阅读:170316 作者:1790

技术要点: 1、JVM、Dalvik与Art的区别

2、那个dex和class到底在结构上有什么不同呢?

3、JVM是基于堆栈的。 什么是堆栈? 程序的执行原理是如何进行的

4、寄存器在安卓虚拟机中起到了什么作用,与堆栈有什么区别

5、Arm指令是什么,能告诉我和字节码指令的区别吗?

6、为什么Art虚拟机运行速度比Dalvik虚拟机快

7、Art虚拟机运行的是主函数,堆内存分布如何

首先,为什么需要了解虚拟机?

我认为主要有以下几点。

1、对虚拟机运行流程有深刻的认识,这可以加深对APP运行机制的理解

2、有助于反编译、热修复、插件化。 我们理解dex,有助于理解其原理

3、学习这些不能帮助你理解业务逻辑,但他们可以加深你的视野。 原理的掌握反应了你的工作经验

1、JVM、Dalvik和Art三者之间的区别首先让我们谈谈什么是虚拟机。 JVM的作用是将与平台无关的. class中的字节码翻译成与平台相关的机器码,实现跨平台。 Dalvik和Art是安卓使用的虚拟机

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

主要是编译时的JVM和Android虚拟机又有一些不同之处

Art虚拟机和Dalvik虚拟机之间的差异,以及Art虚拟机为什么运行速度比Dalvik虚拟机快:

Dalvik是用JIT(justintime )编译的,每次执行APP应用程序时,它都会实时在机器代码中生成Dalvik.dex的一部分。 Dalvik消耗更少的内存和更少的物理存储空间。 类似于每次执行代码时都必须从压缩包中取出。 内存更少,存储更少,CPU消耗相对更多。 安装快,启动慢

ART使用AOT(aheadoftime )编译,ART具有内置的Ahead-Of-Time编译器,可在APP应用安装过程中将DEX字节码翻译成机器代码并存储在设备的存储器中。 只有在设备上安装了APP应用程序时,才会发生此过程,因为不需要JIT编译,所以代码的执行速度相当快。 安装慢,启动快

预编译还大大提高了电池续航时间,并减少了CPU的使用频率和功耗,因为无需在每次运行APP应用时重复编译

总结:

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

Android虚拟机运行. dex格式的文件,而jvm运行. class文件。 class文件中存在许多冗馀信息, dex工具将删除冗馀信息。 Android虚拟机是寄存器虚拟机,而jvm是基于虚拟堆栈的虚拟机。 class文件表示类,需要多次IO加载。 dex文件中有多个class,只需进行一次IO加载。

安卓虚拟机和JVM有什么关系呢?

Android虚拟机基于JVM实现,唯一的区别在于执行引擎。 一个是寄存器结构,另一个是堆栈结构

2、那个dex和class到底在结构上有什么不同呢?

总结:

1、dex文件减小整体文件大小,dex像压缩文件,一次能够表示更多的class,class是一个文件

2、在安卓虚拟机上加载类时,一次IO就可以为dex加载很多类,但class需要多次加载IO,安卓虚拟机会加快搜索速度

3、dex命令更密集,类命令多

4、dex寄存器便于寻址,class java栈需要多次load和store指令

5、dex适用于移动设备,性能要求不高。 class适用于PC的大容量内存,单一指令小的情况下可以迅速执行

3、JVM是基于堆栈的。 什么是堆栈? 程序执行的原理是如何进行的? 那么什么是寄存器? 什么是堆栈?

据百度百科介绍,寄存器的功能是存储二进制代码,由具有存储功能的触发器组合而成。 因为一个触发器可以存储1位二进制代码,所以存储n位二进制代码的寄存器必须由n个触发器组成。

堆栈(stack )被称为别名堆栈,是运算受到限制的线形表。 限制只能在页脚中进行插入和删除操作的线性表。 这一端称为堆栈顶部,而另一端称为堆栈底部。 在堆栈中插入新元素也称为堆栈、堆栈或推送堆栈。 这是将新元素放置在堆栈的顶级元素上,使其成为新堆栈的顶级元素。 从堆栈中删除元素,也称为堆栈或转义,是删除堆栈的顶级元素,使相邻元素成为新堆栈的顶级元素

执行原理:JVM运行时,指令会在局部变量区域和栈之间频繁堆栈和弹出。

4、寄存器在Android虚拟机中起着什么作用,与堆栈的区别在哪里?目前实际的处理器多为基于寄存器的体系结构,从侧面反映出比基于堆栈的体系结构更好一般来说,寄存器的体系结构被认为比JVM体系结构更快

总结:

堆栈中没有地址(无变量声明)的指令更紧凑,但完成操作需要更多的load/store指令,意味着更多的指令分派(instruction dispatch )次数和内存访问次数

对于Android虚拟机的双地址或三地址命令,虽然每个命令占用的空间多,但总体上可以用更少的命令完成操作,命令

分派与内存访问次数都较少。
Java虚拟机使用的指令只占一个字节,因而成为字节码。
基于寄存器的指令由于需要指定源地址和目标地址,因此需要占用更多的指令空间。
Dalvik虚拟机的某些指令需要占用两个字节。
栈需要更多指令意味着要多占用CPU时间,寄存器需要更多指令空间,意味着数据缓冲(d-cache)更易失效。

5、Arm指令究竟是什么指令,能说说它与字节码指令的区别吗?

字节码指令和Arm指令内容是不一样的
如 同一个 a+b
在JVM的指令 iadd(两int值相加) 、 idiv(两int值相除)、imul(两int值相乘)等
但是在dalvik指令是 add-int 、 mul-int 等
arm指令是由arm公司开发的。指令含有地址,而字节码指令没有地址字节码。
字节码是sun公司开发,简单高效

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。