一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
JVM职责
在硬件上运行JVM语言(可以编译成java字节码的语言) 有java Groovy kotlin 等
- 执行字节码指令
- 加载字节码中的class结构
- 分配和回收代码运行时的内存
ART(Android RunTime)的职责
JVM运行时数据区
栈
FILO(先进后出)
运行时栈帧
虚拟机栈
- 记录线程内方法的执行状态
栈帧
- 栈中的元素,对应每一个方法的执行情况
实例代码:
fun main(){
test()
....
}
基于栈的JVM和基于寄存器的JVM的区别
| 基于栈的JVM | Dalvik(基于寄存器) | |
|---|---|---|
| 字节码单元长度 | 8位(1字节) | 16位(2字节) |
| 单条指令长度 | 短 | 几乎翻倍 |
| 同样逻辑指令条数 | 多 | 少 |
| 同样逻辑数据移动此处 | 多 | 尽可能少 |
| 同样逻辑临时结果存储次数 | 多 | 尽可能少 |
JVM基于栈去设计的初衷之一是压缩代码体积
- java设计之初最重要的一个特性是跨平台,支持嵌入式设备和手持设备(J2ME)
- Java设计之初另一个特性是支持远程传输执行字节码,要降低传输开销 基于栈的虚拟机,字节码实现简单
- 指的是生成字节码的过程简单,而不是虚拟机本身简单,或者说是编译器的实现简单
- 操作时,不用考虑寄存器的地址(绝对位置),只需要把想要操作的数据出栈,入栈,然后再现实如何针对栈进行操作就可以了。 基于栈的虚拟机,可移植性高
- 为了提高效率,虚拟寄存器要映射到真实机器的寄存器,增加移植难度
- 代码移植到其他硬件平台的时候,不用考虑真实机器寄存器的差异,因为操作栈的指令时通用的
Android平台基于寄存器设计好处
更快,更省内存
- 指令条数少
- 数据移动次数少,临时结果存放次数少
- 映射真实机器的寄存器 Android不需要解决移植性问题
- Android平台的操作系统是统一的 使用dex文件优化,解决了代码体积的问题