首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Dalvik基于寄存器,而使用堆栈,有什么不同?

Dalvik是一种针对Android平台开发的虚拟机,它使用基于寄存器的指令集,而不是像传统的Java虚拟机(JVM)那样使用基于堆栈的指令集。这两种指令集的区别在于它们执行操作时所使用的数据结构不同。

  1. 基于堆栈的指令集(例如JVM):
    • 堆栈:基于堆栈的指令集使用一个堆栈数据结构来保存操作数。操作数可以被压入和弹出堆栈,然后通过指令进行处理。这种指令集的设计相对简单,因为操作数的数量和位置都可以通过堆栈指针来追踪。然而,由于每次操作都需要从堆栈中加载和存储数据,因此执行速度可能相对较慢。
  • 基于寄存器的指令集(例如Dalvik):
    • 寄存器:基于寄存器的指令集使用一组寄存器来保存操作数。寄存器是CPU内部的一种存储区域,可以直接访问,而不需要像访问内存一样进行额外的加载和存储操作。这种指令集设计的优势是执行速度较快,因为操作数直接保存在寄存器中,并且可以直接从寄存器中读取和写入数据。然而,寄存器的数量是有限的,因此需要精心管理和分配,以避免寄存器溢出的问题。

相比于基于堆栈的指令集,基于寄存器的指令集在执行速度上具有优势,因为它避免了频繁的堆栈操作。另外,Dalvik的设计目标是在资源受限的移动设备上提供高效的虚拟机运行环境,而基于寄存器的指令集可以更好地满足这个目标。

值得注意的是,随着Android平台的发展,Dalvik已经被ART(Android Runtime)所取代,而ART引入了Ahead-of-Time(AOT)编译技术,将字节码在安装应用时就编译成机器码,进一步提升了应用的执行效率和响应速度。

腾讯云相关产品和产品介绍链接地址:

  • 云计算服务:https://cloud.tencent.com/product/cvm
  • 人工智能服务:https://cloud.tencent.com/product/ai
  • 数据库服务:https://cloud.tencent.com/product/cdb
  • 云存储服务:https://cloud.tencent.com/product/cos
  • 物联网服务:https://cloud.tencent.com/product/iotexplorer
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

从JVM到Dalivk再到ART(class,dex,odex,vdex,ELF)

Android 是先有 JVM 然后是 Dalvik ,接着是现在的 ART虚拟机 。那么他们之间什么关系呢?...另外基于寄存器架构的VM执行起来更快,但是代价是更大的代码长度。 基于寄存器架构的虚拟机有这么多的好处,为什么之前设计JAVA的程序员没有采用呢,而是采用现在基于栈的架构开发的呢?...一般来说,基于堆栈的机器必须使用指令才能从堆栈上的加载和操作数据,因此,相对基于寄存器的机器,它们需要更多的指令才能实现相同的性能。...bytecode 想要了解更多:基于栈的虚拟机 VS 基于寄存器的虚拟机 Dalvik在JVM上的优化 在编译时提前优化代码不是等到运行时 虚拟机很小,使用的空间也小;被设计来满足可高效运行多种虚拟机实例...常量池已被修改为只使用32位的索引,以简化解释器 标准Java字节码实行8位堆栈指令,Dalvik使用16位指令集直接作用于局部变量。局部变量通常来自4位的“虚拟寄存器”区。

1.9K21

Apk 反编译前期了解

一、前期内容了解 反编译 Apk,并不是直接拿过来 Apk,改名,解压缩或者使用某些工具直接反编译。 徒有其表,并不是自己的东西。So,在反编译之前,我们需要掌握什么技能点呢? 1....Dalvik 虚拟机使用的指令是基于寄存器 Java 虚拟机则使用的指令集是基于堆栈的。(Dalvik 基于寄存器 JVM 基于栈。)...而这里,简述下 Dalvik 和 Java 运行环境的区别: Dalvik 主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能; Dalvik 负责进程隔离和线程管理...寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器指令寄存器(IR)和程序计数器(PC)。...在中央处理器的算术及逻辑部件中,存器累加器(ACC)。 寄存器俩种不同的命名方式,如下图所示: ? 而在实际当中,一般来讲,P(0) 代表当前指针。

1K30

Android 逆向笔记 —— 说说 Dalvik 及其指令集

当年也有一部分业内人士认为 Dalvik 是 Google 为了避免与 Oracle 的诉讼诞生的产物。Dalvik基于 Apache License 2.0 发布的。...DEX 文件提供了一个统一的共享的常量池,供所有类文件使用,这样就避免了冗余信心,减小了文件体积,提高了解析效率。 虚拟机架构不同 JVM 是基于栈架构的。...Dalvik基于寄存器架构的,数据的访问直接在寄存器之间传递。 基于堆栈的机器与基于寄存器的机器谁更有优势一直是个争论不休的话题。...一般来说,基于堆栈的机器必须使用指令才能从堆栈上的加载和操作数据,因此,相对基于寄存器的机器,它们需要更多的指令才能实现相同的性能。但是基于寄存器机器上的指令必须经过编码,因此,它们的指令往往更大。...寄存器命名 我们都知道 Dalvik 虚拟机是基于寄存器架构的,其使用寄存器都是 32 位的。对于 64 位类型,使用相邻两个寄存器来表示。

1.2K10

JAVA虚拟机与Android虚拟机的区别

class文件的缺点 如果A类文件引用B类文件中的方法,方法签名也会被复制到A类文件中, 多个不同的类会同时包含相同的方法签名 大量的字符串常量在多个类文件中也被重复使用 因为大量的冗余信息,会严重影响...2.JVM基于栈,DVM基于寄存器 关于栈式虚拟机: 1.代码必须使用这些指令来移动变量(即push和pop) 2.代码尺寸小和解码效率会更高些 关于寄存器式虚拟机: 1.基于寄存器代码免去了使用...2.代码尺寸和解码效率不如基于栈虚拟机,因为它包含操作数,所以指令大于基于堆栈的指令。但是基于寄存器产生更少的代码,所以总的代码数不会增加。...3.寄存器虚拟机必须从操作指令中解码操作数,需要额外的解码操作。...与JVM相似,在Dalvik VM中每个线程都有自己的PC和调用栈 与JVM不同的是,Dalvik VM的栈帧中没有局部变量区与求值栈,取而代之的是一组虚拟寄存器 3.ART虚拟机,和JVM/DVM什么不同

1.1K20

ART dex2oat Compiler –Quick 和Optimizing

首先ART兼容Dalvik.也就是说ART 能运行”dex”(Dalvik执行文件).因此对Androidapp的开发者来说,他们没有什么区别.两者最大的区别是:ART把JIT(Just-in-Time...)变成了AOT(Ahead-of-Time).JIT需要在每次运行app时都需要执行一遍,AOT 只需要执行一次,而后续再运行此app是不需要再执行,其明显提高了性能.当然ART 这样做,也是代价的...在Optimizing 中用一个IR (IntermediateRepresentation) 二不像Quick中使用两个IR。其对常量和全局变量了全新的优化。...另一个主要的改进是改进的寄存器分配形式。Quick 使用非常简单的算法来分配寄存器。Quick的目标是speed 不是效率,这就导致了大量的寄存器被泄露给堆栈。...用更少的寄存器来节省堆栈和更好地利用可用的寄存器,减少的代码执行,从而提高了性能。 How to 使用下面的属性可以改变编译方式。

45010

JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比

2、什么是DVM,和JVM什么不同?...JVM是Java Virtual Machine,DVM就是 Dalvik Virtual Machine,是安卓中使用的虚拟机,所有安卓程序都运行在安卓系统进程里,每个进程对应着一个Dalvik...③JVM基于栈,DVM基于寄存器 JAVA虚拟机基于栈结构,程序在运行时虚拟机需要频繁的从栈上读取写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费很多CPU时间。...Dalvik虚拟机基于寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。...3、什么是ART虚拟机,和JVM/DVM什么不同? 首先了解JIT(Just In Time,即时编译技术)和AOT(Ahead Of Time,预编译技术)两种编译模式。

1.4K20

笔记——JVM、DVM(dalvik)和ART之间的区别(二十)

2、什么是DVM? Android 运行环境主要指的Dalvik虚拟机技术,也就是安卓虚拟机DVM。...它使用的是寄存器架构不是JVM中常见的栈架构。...JVM与DVM 二者最大的区别在于JVM是以基于栈的虚拟机(Stack-based),DVM是基于寄存器的虚拟机(Register-based)。...基于寄存器的虚拟机虽然比基于堆栈的虚拟机在硬件通用性上要差一些,但是它的代码执行效率却更好。 显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。...增加了对新的操作码的支持,使文件结构尽量简洁,使用等长的指令,借以提高解析速度。 3、什么是ART虚拟机,和JVM/DVM什么不同

3.1K30

Android-Dalvik虚拟机

Dalvik虚拟机作为Android平台的核心组件 1.体积小,占用内存空间小 2.专有的DEX可执行文件 体积更小 常量更快 3.常量池采用32位索引值 寻址类方法名 字段名 常量更快 4.基于寄存器架构...并拥有一套完整的指令系统 5.提供了对象生命周期管理 堆栈管理 线程管理 安全和异常管理以及垃圾回收等重要功能 6.所有的Android程序都运行在Android系统进程里 每个进程对应一个Dalvik...class文件中 Java虚拟机通过编码class文件中的内容来运行程序 Dalvik虚拟机运行的是Dalvik字节码 所有Dalvik字节码由Java字节码转换而来 并被打包到一个DEX可执行文件中...Dalvik可执行文件体积更小 dx工具对常量池的压缩 使得相同的字符串 常量 在DEX文件中只出现一次,从而减小了文件的体积 3.Java虚拟机与Dalvik虚拟机架构不同 Java虚拟机基于栈架构...程序在运行时虚拟机需要频繁的从栈上读取或写入数据 这个过程需要更多的指令与内存访问次数 会耗费不少CPU时间 对于像手机设备资源有限的设备来说这是相当大的一笔开销 Dalvik虚拟机基于寄存器架构 数据的访问通过寄存器间直接传递

42610

我为Dexposed续一秒——论ART上运行时 Method AOP实现

ART什么特别的? 为什么Dexposed能够在Dalvik上为所欲为,到ART时代就不行了呢?...5.0/5.1) 上的ART是在Dalvik上的JIT编译器魔改过来的,名为quick(虽然个portable编译器,但是从未启用过);这个编译器会做一定程度的方法内联,因此很多基于入口替换的Hook...为什么会这么干呢?...最直接的办法是把被Hook的方法通过额外参数直接传递给bridge函数,传递参数可以通过寄存器堆栈实现。...也许你会问,这个比较逻辑是必要的吗?除了达到调用原函数的目的之外,这个逻辑还有一个更重要的用途:区分入口相同,但是实际上Java方法完全不同的处理逻辑。 什么时候不同的Java函数的入口会一样呢?

1.7K31

深入剖析 JavaScriptCore

答案是否定的,Android 使用的虚机叫 Dalvik VM),这款虚机在很多设计上都与 JVM 兼容,字节码是二地址和三地址并用的方式,是基于寄存器的架构。...Dalvik VM 的每个线程程序计数器和调用栈,方法的调用和 JVM 一样是会分配一个新的帧,不同的是 Dalvik VM 使用的是虚拟寄存器来替代 JVM 里的局部变量区和求值栈。..., Dalvik VM 调用完方法后,那些寄存器值会恢复成调用前的可以很好的避免这样的问题。...,所以使用堆栈结构,这样就可以避开寄存器分配这样的难题。...,这也是为什么对于闭环的苹果来说会在 JavaScriptCore 的虚机里采用性能更好的基于寄存器的架构,不去顾及移植性。

1.2K10

安卓逆向系列篇:Dalvik概念&破解实例

Dalvik VM是基于寄存器的,JVM是基于栈的;Dalvik专属的文件执行格式dex(dalvik executable),JVM则执行的是java字节码。...M个寄存器,其中函数的参数是N个,那么参数使用最后的N个寄存器,局部变量使用从头开始的前M-N个寄存器 Dalvik寄存器两种命名法 v命名法 v命名法采用以小写字母“v”开头的方式表示函数中用到的局部变量与参数...参数寄存器 v(m-n)~vm 局部变量寄存器 v0~vn p命名法 基本上类似,主要是参数寄存器使用p命名寄存器局部变量寄存器还是使用v命名寄存器 参数寄存器 p0~pn 变量寄存器 v0~vn...指令集 上面只是简单了解了Dalvik字节码,具体每个方法涉及到的逻辑还需要Dalvik指令集来解释,下面介绍Dalvik指令集,由于Dalvik虚拟机是基于寄存器架构的,其指令集的风格更偏向于x86...,不同时间(一段时间)的数据是不同的这时候我们可以用Service在后台定时更新,不用每打开应用的时候在去获取。

1.6K10

Android 系统架构和应用组件那些事

Android 应用虽然使用Java 语言开发,但是使用的虚拟就是Dalvik Virtual Machine,简称DVM。...从上图可以看出,Java虚拟机和Dalvik虚拟机主要有两大区别:一是它们编译后的文件不同;二是它们基于的架构不同。...具体如下:  编译后的文件不同 Java虚拟机运行的是.class字节码文件,Dalvik虚拟机运行的则是其专有的.dex文件。... 基于的架构不同 Java虚拟机是基于栈的架构,大家知道,栈是一个连续的内存空间,取出和存人的速度比较慢;Dalvik基于寄存器的架构,寄存器是CPU上的一块缓存,寄存器的存取速度要比从内存中存取的速度快很多...在4.4 系统之前,Android 系统在Linux 的底层下构筑Dalvik 一层的虚拟机,通过其可以更好适应多样的硬件架构,开发者只需要按一套规则进行应用便可,无需因为不同的硬件架构处理与底层的驱动关系

1.7K60

RTSP和RTMP协议什么区别?RTSP为什么常用于安防监控摄像头行业,视频直播却只使用RTMP推流?

它们以下区别: 传输层协议:RTSP是基于UDP或者TCP的应用层协议,RTMP是基于TCP的应用层协议。...RTSP使用TCP来进行控制信令的传输,多媒体数据则使用RTP协议进行UDP传输;RTMP则将控制信令和多媒体数据都封装在同一个TCP应用层协议中,因此RTMP可以利用TCP特性进行丢包补偿,RTSP...RTSP为什么常用于安防监控摄像头行业 RTSP是常常应用于安防监控摄像头,其他领域基本很少使用。...为什么直播都使用RTMP协议推流,不用RTSP或者webrtc 直播行业选择使用RTMP协议推流的原因几个: RTMP协议具有较低的延迟。...总的来说,直播行业选择使用RTMP协议推流主要基于其较低的延迟、跨平台兼容性和丰富的功能。然而,随着技术的发展和标准的不断演进,直播行业可能会逐渐采用更多的协议和技术,以满足不同需求和场景的要求。

3.3K11

救救孩子吧,快看个面试题吧!

但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals其自身的实现,不再是比较类在堆内存中的存放地址了。...jvm: java->class->jar dvm: java->class->dex 2.基于的架构不一样 Dalvik 基于寄存器寄存器是CPU上面的一块存储空间; JVM 基于栈,栈是内存上面的一段连续的存储空间...3.Dalvik 和 Java 运行环境不同 Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。...Dalvik虚拟机自己的 bytecode,并非使用 Java bytecode。 JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境。...JVM本身不具备跨平台功能的,每个操作系统都有不同版本的虚拟机 4.Dalvik 和 Java 的SDK不同 其他: Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能

90110

Android内存优化(一)DVM和ART原理初探

需要注意的是DVM并不是一个Java虚拟机(以下简称JVM),至于为什么,下文会给你答案。 DVM与JVM的区别 DVM之所以不是一个JVM ,主要原因是DVM并没有遵循JVM规范来实现。...基于的架构不同 JVM基于栈则意味着需要去栈中读写数据,所需的指令会更多,这样会导致速度慢,对于性能有限的移动设备,显然不是很适合。...DVM是基于寄存器的,它没有基于栈的虚拟机在拷贝数据而使用的大量的出入栈指令,同时指令更紧凑更简洁。...但是由于显示指定了操作数,所以基于寄存器的指令会比基于栈的指令要大,但是由于指令数量的减少,总的代码数不会增加多少。...ART的运行时堆 与DVM的GC不同的是,ART的GC类型多种,主要分为Mark-Sweep GC和Compacting GC。

1.3K101

JVM内存模型

这些区域旨在存储程序或 JVM 本身使用的数据。我将首先介绍 JVM 的概述,然后介绍字节码是什么,最后介绍不同的数据区域。 内容显示 全球概览 JVM 是底层操作系统的抽象。...基于堆栈的架构 JVM 使用基于堆栈的体系结构。虽然它对开发人员来说是不可见的,但它对生成的字节码和 JVM 架构巨大的影响,这就是为什么我将简要解释这个概念的原因。...int 结果 (3 + 4) 被压入操作数堆栈以供其他操作使用。 这种运行方式称为基于堆栈的架构。还有其他处理基本操作的方法,例如基于寄存器的体系结构将操作数存储在小寄存器不是堆栈中。...桌面/服务器 (x86) 处理器和以前的 android 虚拟机 Dalvik 使用这种基于寄存器的架构。 字节码 由于 JVM 解释字节码,因此在深入之前了解它是有用的。...在 256 个可能的 1 字节长的 操作码中, 204 个当前在 java8 规范中使用。 这是不同类别的字节码操作的列表。

80140

Android内存管理(JVM 、DVM(dalvik) 、ART简介)

存储位置不同 存储内容不同:元空间存储的是「类型信息」(即类的元信息),永久代除了类型信息,还包括「字符串常量池」和「静态变量」等(可以理解为元空间是永久代拆分出来的一部分)。...那么问题来了:为什么要把永久代替换为元空间呢?...基于的架构不同:JAVA虚拟机基于 栈结构,程序在运行时虚拟机需要频繁的从栈上读取写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费很多CPU时间。...Dalvik虚拟机基于 寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。...基于栈的架构具有更好的可移植性,因为其实现不依赖于物理寄存器 基于栈的架构通常指令更短,因为其操作不需要指定操作数和结果的地址 基于寄存器的架构通常运行速度更快,因为寄存器的支撑 基于寄存器的架构通常需要较少的指令来完成同样的运算

1.7K10

Java虚拟机和Dalvik虚拟机的区别java虚拟机和Dalvik虚拟机的区别

但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时还要两个明显的不同: Java虚拟机运行的是Java字节码,Dalvik虚拟机运行的则是其专有的文件格式...基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多 dalvik虚拟机是基于寄存器的 java虚拟机运行的是java字节码。...dalvik的堆和栈的参数可以通过-Xms和-Xmx更改 一个应用,一个虚拟机实例,一个进程(所有android应用的线程都是对应一个linux线程,都运行在自己的沙盒中,不同的应用在不同的进程中运行...每个android dalvik应用程序都被赋予了一个独立的linux PID(app_*)) Dalvik和标准Java虚拟机(JVM)之间的首要差别之一,就是Dalvik基于寄存器JVM基于栈...JVM和Dalvik进程管理:         linux中进程间通信的方式很多,但是dalvik使用的是信号方式来完成进程间通信。 Android的初始化流程: ?

2.5K90
领券