JVM和Dalvik VM

Dalvikvm_pro:安卓 Dalvikvm Android Dalvikvm dalvikvm:用来后台创建一个虚拟机运行指定的java类 即使应用程序被关闭或者杀死。dalvikvm中执行的方法依旧能运行。 核心:dalvikvm –cp dex化jar路径 需要执行的主函数类完整类名 主函数参数 主函数多个参数的空格隔开 前置说明 ANDROID_DATA默认为/data 执行dalvikvm后需要生成一个dex文件存放在$ANDROID_DATA/dalvik-cache 目录下 所以执行时必须对目录要有写入权限。一般情况下,程序无root权限。所以无法读写默认的/data/ dalvik-cache区。只能存在应用本身的缓存区域。/data/data/包名/ 目录下。 执行export ANDROID_DATA=/data/data/包名/ 修改环境变量,紧接着执行dalvikvm命令。代码中执行时一定要用逗号隔开,同一句执 立即下载

来源传智播客Android培训学院

部分来源于知乎 作者:天光    链接:https://www.zhihu.com/question/20207106/answer/14654536

Dalvik虚拟机是Google公司自主设计的运行于Android平台的Java虚拟机。JVM是归Oracle公司所有的,运行在基于PC机上的Window 和Linux操作系上的java虚拟机。Google工程师之所以设计Dalvik虚拟机主要有以下两点原因:若要使用JVM需要获得授权许可,这意味着需要缴纳大量的费用;JVM主要是针对于CPU快,内存大的传统PC机,不适合移动设备。

JAVA 虚拟机(JVM) 是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,它有自己完善的硬件架构(如堆栈、处理器、寄存器),还具有响应的指令系统。使用“Java 虚拟机”程序就是为了支持与操作系统无关,在任何系统中投可以运行的程序。

Dalvik 虚拟机是android程序中的虚拟机,是android 中java程序运行的基础,器指令集基于寄存器架构,执行其特有的 文件格式-dex字节码来完成对对象的生命周期管理、堆栈管理、线程管理、安全异常管理

垃圾回收等重要功能,它的核心内容是实现库(libdvm.so),大体由C语言实现。依赖于Linux内核的一部分功能-线程机制、内存管理机制。能高效使用内存,并在低速CPU上表现出高性能。

1. 对比两种虚拟机


Dalvik和JVM两种不同的虚拟机比较如下图1-1所示:
图1-1两种虚拟机的比较

通过对比上图我们可以得出如下几点区别:
(1)Java虚拟机运行java字节码,Dalvik虚拟机运行其专有的文件格式.dex。
(2)为了进一步提高运行速度,Dalivk虚拟机可以运行八进制的文件.odex。
(3)Dalvik基于寄存器,而JVM基于栈。基于寄存器的虚拟机对于编译之后变大的程序来说,在它们执行时候,花费的时间更短。

dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机实例,并且每一个dalvik都作为一个单独的Linux进程执行。

2. 对比两种虚拟机编译的文件


下图是两种不同虚拟机编译文件格式的对比,左图是JAVA虚拟机常用的.Class文件,右图是Dalvik虚拟机运行的.dex文件。下面展示的是.class文件转换为.dex文件的过程图,如图1-2所示。
图1-2.class文件转换成.dex


JVM的可执行文件是.class格式,每一个.java文件经过编译之后都要生成ClassFile文件。ClassFile文件是由一个8位的字节流组成的,每一个ClassFile都有固定的格式。从左图可以看出一个.class文件包含的字段:
l Header:头文件用来记录当前自解码的版本以及文件的格式。
l Contant Pool:常量池,存储常量。例如:Public static final String str =”itcast”便会存放在常量池中。
l Class:自解码真正的内容,包含filed,Method,Attributes。
传统的JVM在执行代码时会有多个相同结构的ClassFile文件,Google工程师在编写Dalvik虚拟机时将这些格式相同的ClassFile文件合并成.dex文件,在合并这些文件的同时对.class文件中都出现的常量进行提取并放在常量池(String Constant Pool)中,类常量,字段常量,方法常量也以此类推。这种做法使移动平台能够更快的解析各个文件,提高效率。.odex文件格式是对.dex格式文件的进一步优化。


3.本质区别

  •  其核心差异是Dalvik VM架构是register-based,JVM是stack-based的。也就是架构上的差异。reg based VM的好处是可以做到更好的提前优化。 另外reg based的VM执行起来更快,但是代价是更大的代码长度。
  • Dalivik允许多个实例的运行,也就是说每一个Android 的App是独立跑在一个VM中.这样做的好处是一个App crash只会影响到自身的VM,不会影响到其他。 Dalvik的设计是每一个Dalvik的VM都是Linux下面的一个进程。那么这就需要高效的IPC。另外每一个VM是单独运行的好处还有可以动态active/deactive自己的VM而不会影响到其他VM。
  • 当然stack based的VM也有其优点,就是它不对host平台的reg数量做假设,有利于移植到不同的平台。而Dalvik则不关心这些,因为它本来就是为ARM这样的多reg平台设计的。另外Dalvik被移植到x86也说明,即使是x86这种寄存器很少的平台,基于寄存器的VM也是没有问题的。


下面着重说DVM的优势:

   1、在编译时提前优化代码而不是等到运行时。
   2、虚拟机很小,因此使用的空间也小,被设计了来满足可高效运行多种虚拟机实例。
   3、常量池已被修改为只使用32位的索引,以简化解释器。
 
现在实际的处理器,大多都是基于寄存器的架构,从侧面反映出基于寄存器比基于栈的架构更与实际的处理器接近。但对于VM来说,源架构的求值 栈或者寄存器都可能是用实际机器的内存来模拟的,所以性能特性与实际硬件又有不同。一般认为基于寄存器架构的Dalvik VM比基于栈架构JVM执行效率更高,原因是:虽然零地址指令更紧凑,但完成操作需要更多的load/store指令,也意味着更多的指令分派 (instruction dispatch)次数与内存访问次数;访问内存是执行速度的一个重要瓶颈,二地址或三地址指令虽然每条指令占的空间较多,但总体来说可以用更少的指令完 成操作,指令分派与内存访问次数都较少。

在一个解释器上执行 VM 指令,包含三个步骤,指令分派、访问操作数和执 行计算。 
  • 指令分派(Instructions dispatch)负责从内存中读取 VM 指令,然后跳转到相应的解释器代码 指令分派 中。上面提到过,完成同样的事情,基于栈的虚拟机需要更多的指令,意味着更多的指令分派和 内存访问次数,这是 JVM 的执行性能不如 Dalvik VM 的原因之一。
  • 访问操作数 访问操作数(Operands access)是指读取和写回源操作数和目的操作数。Dalvik VM 通过虚拟 操作数 寄存器来访问操作数, 由于具有相近的血缘, Dalvik 的虚拟寄存器在映射到物理寄存器方面具有 更充分的优势, 这也是 Dalvik VM 性能较佳的一个原因。 JVM 的操作数通过操作数栈来访问, 而 因为指令中没有使用任何通用寄存器,在虚拟机的实现中可以比较自由的分配实际机器的寄存 器,因而可移植性高。作为一个优化,操作数栈也可以由编译器映射到物理寄存器上,减少数据 移动的开销。
  • 指令执行(Instructions compute)这个似乎没什么可解释的,老老实实执行就行。
一个应用中会定义很多类, 编译完成后即会有很多相应 的CLASS文件,CLASS文件 间会有不少冗余的信息。
dex字节码和标准Java的字节码(Class)在结构上的一个区别是dex字节码将多个文件整合成一个,这样,除了减少整体的文件尺寸,I/O操作,也提高了类的查找速度。
原来每个类文件中的常量池现在由DEX文件中一个常量池来管理。

DEX文件可以进行进一步优化。优化主要是针对以下几个方面:

1、调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的没一个域
2、验证DEX文件中的所有类
3、对一些特定的类进行优化,对方法里的操作码进行优化

优化 优化后的文件大小会有所增加,应该是原DEX文件的1-4倍。 odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化 。

每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。每个进程之间可以通信(IPC,Binder机制实现)。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。


不同的应用在不同的进程空间里运行,当一个虚拟机关闭或意外中止时不会对其它虚拟机造成影响,可以最大程度的保护应用的安全和独立运行。
Zygote是虚拟机实例的孵化器。AndroidRuntime.cpp中ZygoteInit.main()的执行会完成一个分裂,分裂出来的子进程继续初始化Java层的架构,这个分裂出来的进程就是system_server。每当系统要求执行一个Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。








Bytecode for the Dalvik VM NULL 博文链接:https://mysuperbaby.iteye.com/blog/1392516 立即下载

相关推荐

Dalvik VM 簡介

介紹 Android Dalvik VM 的相關知識. Interpreter Switch dispatch Direct call threading interpreter Direct threading The context problem (HW architecture / branch perdition) Subroutine threading Let's talk about Dalvik interpreter JIT (Just in Time) Compiler Basic Idea How to identify hot path Hot and Cold traces Dalvik Trace JIT Flow Trace-based vs. Method based JIT The Decision & Future Directions by Jing.

Dalvik VM介绍

Dalvik VM介绍

hffyyg的博客 1708

UR机械臂正逆运动学解析:从DH参数到8组解的完整求解策略

本文深入解析UR机械臂的正逆运动学求解策略,从DH参数原理到完整的8组解求解方法。详细介绍了正运动学的坐标变换过程,以及逆运动学中Atan2函数和三角恒等变换的应用,并揭示了8组解的产生机制。通过实际案例和调试技巧,帮助工程师掌握UR机械臂运动学求解的核心技术。

weixin_29094775的博客 413

Dalvik 和 ART虚拟机

1. Dalvik 虚拟机 Dalvik 虚拟机(Dalvik Virtual Machine),简称 Dalvik VM 或者 DVM。它是 Google 专门为 Android 平台开发的虚拟机,运行在 Android 运行时库中。DVM 并不是一个 Java 虚拟机,原因如下。 1.1 DVM 与 JVM 的区别 DVM 没有遵循 JVM 规范来实现,与 JVM 主要区别如下: 1. 基于的架构不同 JVM 的执行的指令是基于栈结构,这就意味着需要去栈中读写数据,所需的指令会很多,会导致速度

wangbuji的博客 1719

OCC WebGL案例编译实战:从FreeType配置到静态库生成

本文详细记录了将OCC(Open CASCADE Technology)3D图形库编译为WebAssembly(Wasm)并在浏览器中通过WebGL渲染的实战过程。重点解决了FreeType库的交叉编译配置、OCC核心库的裁剪与静态库生成,以及WebGL样例项目的CMake改造等关键步骤,为开发者提供了从环境搭建到最终集成的完整指南。

weixin_28831461的博客 315

Llama模型结构拆解:为什么MLP模块要这样设计?从参数配置到计算流程全解析

本文深入解析了Llama模型MLP模块的设计精髓。通过拆解其三线性层结构、门控机制与SwiGLU激活函数,揭示了并行计算如何提升效率,并详细阐述了intermediate_size参数配置背后的经验权衡与计算考量,帮助读者透彻理解这一核心组件的设计逻辑与工程实现。

mac99的博客 529

Dalvik VM

谷歌开发的,应用于Android系统,并在Android2.2中提供了JIT,发展迅猛。 Dalvik VM只能称作虚拟机,而不能称作“Java虚拟机”,它没有遵循 Java虚拟机规范,不能直接执行Java的Class文件 基于寄存器架构,不是jvm的栈架构。 执行的是编译以后的dex(Dalvik Executable)文件。执行效率比较高。 它执行的dex(Dalvik Executable)文件可以通过class文件转化而来,使用Java语法编写应用程序,可以直接使用大部分的Java API等。

Leon_Jinhai_Sun的博客 549

用Python实现古诗词填字游戏(三)

古诗词做填字游戏的第三部分代码,也是最核心的部分。实现对诗文和关键字的选定,并确定文字的输出位置。

PosPro的专栏 6117

Android虚拟机 —— Dalvik 和 ART

Dalvik 虚拟机 (Dalvik Virtual Machine ), 简称 **Dalvik VM** 或者 **DVM**。DVM 是 Google专门为Android平台开发的虚拟机,它运行在Android运行时库中。每一个应用程序对应有一个单独的Dalvik虚拟机实例。

xiaokangss的博客 3742

避坑指南:C# OpenCvSharp调用4K摄像头常见的5个问题及解决方案

本文针对C# OpenCvSharp调用4K高清摄像头时常见的五大难题,提供了详细的解决方案。内容涵盖分辨率设置失效、帧率卡顿、内存泄漏、硬件驱动兼容性以及性能优化实战,帮助开发者高效稳定地处理4K视频流,提升智能安防监控等项目的开发效率。

weixin_29268331的博客 424

【WRF安装(2025)】服务器移植 WRF 安装环境

【WRF安装(2025)】服务器移植 WRF 安装环境

WW、forever的博客 106

Dalvik VM 和 JVM 的比较

Ke1vin的博客 486

4.3 Langfuse 集成实战:追踪 OpenAI、LangChain 和 LangGraph 应用

本文介绍了如何将Langfuse集成到不同类型的AI应用中,包括原生OpenAI、LangChain和LangGraph应用。主要内容包括: 两种集成模式:手动追踪(精确控制)和自动追踪(通过回调机制) 三种应用场景的集成方案: 原生OpenAI应用:使用langfuse.trace()手动记录对话流程、LLM调用和工具执行 LangChain应用:通过LangfuseCallbackHandler自动追踪Agent执行过程 LangGraph应用:与LangChain相同的自动追踪方式,可可视化节点和状态

yonggeit的博客 3303

JVM 和 Dalvik VM 区别

1.JVM (Java Virtual Machine,Java 虚拟机)

Cassandra_sj的博客 622

从战略到执行:业务领先模型 BLM 的第一把钥匙「差距分析」

业务领先模型「BLM」(Business Leadership Model),俗称“别乱摸”,起源于哈佛商学院的战略理论研究,是一套完整的战略规划方法论。 后来被 IBM 发扬光大,IBM 在转型关键时期完成了对 BLM 模型的导入和创新,从此这个模型成为 IBM 中高层用于战略制定与执行联接的方法与平台。 再到后来华为花巨资引入了 BLM 模型,经过多年的应用,将其演化成了公司战略规划和落地的主要方法与流程,也因此被中国科技企业所认识和接受。 BLM 模型可以解决哪些问题? 在企业内,

产品线负责人 2400

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Dalvik VM和JVM

(1) Dalvik VM和JVM 的第一个区别是 Dalvik VM是基于寄存器的架构(reg based),而JVM是栈机(stack based)。reg based VM的好处是可以做到更好的提前优化(ahead-of-time optimization)。 另外reg based的VM执行起来更快,但是代价是更大的代码长度。 (2) 另外一个区别是Dalvik可以允许多个instanc

A2268320026的专栏 688

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Dalvik VM和JVM的简介、区别

Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。(dx 是一套工具,可以将 Java .class 转换成 .dex 格式. 一个dex档通常会有多个.class。由于dex有...

R_fenglei的博客 455

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Dalvik VM和JVM的比较

学过Java肯定对Java虚拟机不陌生,Android同样运行java代码,运行在谷歌公司的Dalvik VM上的。既然Android有一套自己的DVM虚拟机,那一定比JVM更实用。dvm把所有的.class文件变成一个dex文件,这就像打包一样。原理也就和DVM基于的架构是相似的,寄存器就相当于CPU的内存,JVM基于的栈就相当于内存,所以CPU的速度是优于内存的

极客园地 573

Framework篇 - Dalvik VM、ART VM 和 JVM 的比较

今天来对比下与 Android 有关的3个虚拟机:JVM、Dalvik、ART。 目录: JVM 简述 Dalvik 简述 ART 简述 1. JVM 简述 JVM 是Java Virtual Machine (Java虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java 语言...

u014294681的博客 836

Dalvik VM和JVM比较

1、Dalvik 和标准 Java 虚拟机(JVM)首要差别 Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。    2、Dalvik 和 Java 字节码的区别 Dalvik执行.dex格式的字节码,而JVM执行.class格式的字节码. 3、Dalvik 和 Java SDK的SDK不同 4、Dalvik 和 Java 运

Crazy9599的专栏 648

Dalvik VM和JVM的浅析

http://zh.wikipedia.org/wiki/Android http://zh.wikipedia.org/wiki/Dalvik虚拟机 http://zh.wikipedia.org/wiki/Java虚拟机   一、Dalvik VM和JVM的理解   JVM是一个虚构出来的运行Java程序的运行时,是通过在实际的计算机上仿真模拟各种计算机功能的实现

PuddingGuo 870

Dalvik VM 和JVM的比较

避免出现版权问题android重写JVM 两者在编译后的文件格式区别: JVM: .java->.class->.jar DALVIK VM:.java->.class->.dex->.odex 两者基于的架构: JVM:基于栈的架构 DALVIK VM:基于寄存器的架构 转载于:https://www.cnblogs.com/howla...

weixin_30477797的博客 115

JVM和Dalvik VM的简要区别

Dalvik虚拟机与Java虚拟机的最显著区别是它们分别具有不同的类文件格式以及指令集。Dalvik虚拟机使用的是dex(Dalvik Executable)格式的类文件,而Java虚拟机使用的是class格式的类文件。一个dex文件可以包含若干个类,而一个class文件只包括一个类。由于一个dex文件可以包含若干个类,因此它就可以将各个类中重复的字符串和其它常数只保存一次,从而节省了空间,这样就...

augfun的博客 632
上一篇: android 启动过程的分析
下一篇: android NDK java-c中的签名
技术搬运工
博客等级 码龄11年 3粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值