JVM 知多少

118 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

JVM职责

image.png

在硬件上运行JVM语言(可以编译成java字节码的语言) 有java Groovy kotlin 等

  • 执行字节码指令
  • 加载字节码中的class结构
  • 分配和回收代码运行时的内存

ART(Android RunTime)的职责

image.png

JVM运行时数据区

image.png

FILO(先进后出)

image.png

运行时栈帧

虚拟机栈

  • 记录线程内方法的执行状态

栈帧

  • 栈中的元素,对应每一个方法的执行情况

实例代码:

    fun main(){
        test()
        ....
    }

image.png

基于栈的JVM和基于寄存器的JVM的区别

基于栈的JVMDalvik(基于寄存器)
字节码单元长度8位(1字节)16位(2字节)
单条指令长度几乎翻倍
同样逻辑指令条数
同样逻辑数据移动此处尽可能少
同样逻辑临时结果存储次数尽可能少

JVM基于栈去设计的初衷之一是压缩代码体积

  • java设计之初最重要的一个特性是跨平台,支持嵌入式设备和手持设备(J2ME)
  • Java设计之初另一个特性是支持远程传输执行字节码,要降低传输开销 基于栈的虚拟机,字节码实现简单
  • 指的是生成字节码的过程简单,而不是虚拟机本身简单,或者说是编译器的实现简单
  • 操作时,不用考虑寄存器的地址(绝对位置),只需要把想要操作的数据出栈,入栈,然后再现实如何针对栈进行操作就可以了。 基于栈的虚拟机,可移植性高
  • 为了提高效率,虚拟寄存器要映射到真实机器的寄存器,增加移植难度
  • 代码移植到其他硬件平台的时候,不用考虑真实机器寄存器的差异,因为操作栈的指令时通用的

Android平台基于寄存器设计好处

更快,更省内存

  • 指令条数少
  • 数据移动次数少,临时结果存放次数少
  • 映射真实机器的寄存器 Android不需要解决移植性问题
  • Android平台的操作系统是统一的 使用dex文件优化,解决了代码体积的问题