精华内容
下载资源
问答
  • 《Android Dalvik虚拟机结构及机制剖析:第1卷 Dalvik虚拟机结构剖析》是一本以情景方式对Android的源代码进行深入分析的书,内容广泛,主要从Dalvik虚拟机整体结构、获取和编译Dalvik虚拟机的源码、源码分析辅助...
  • Android Dalvik虚拟机结构及机制剖析 第1卷.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
  • 本系列丛书共分2卷,《Android Dalvik虚拟机结构及机制剖析——第2卷 Dalvik虚拟机各模块机制分析》为第2卷,在第1卷的基础上,采有情景分析的方式对Android Dalvik虚拟机的源代码进行了有针对性的分析,围绕类加载...
  • 《Android Dalvik虚拟机结构及机制剖析》《Android Dalvik虚拟机结构及机制剖析》《Android Dalvik虚拟机结构及机制剖析》《Android Dalvik虚拟机结构及机制剖析》《Android Dalvik虚拟机结构及机制剖析》《Android ...
  • Dalvik虚拟机 PPT版

    千次下载 热门讨论 2013-10-23 01:26:13
    Android应用程序是运行在Dalvik虚拟机里面的,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。Android应用程序中的Dalvik虚拟机实例实际上是从Zygote进程的地址空间拷贝而来的,这样就可以加快Android应用...
  • dalvik虚拟机运行过程分析,详细介绍了dalvik虚拟机
  • Dalvik虚拟机

    2016-08-08 19:53:01
    一、什么是Dalvik? Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。...每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例, 其代码在

    一、什么是Dalvik?

    Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,和在低速CPU上表现出的高性能,确实令人刮目相看。 依赖于底层Posix兼容的操作系统,它可以简单的完成进程隔离和线程管理。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例, 其代码在虚拟机的解释下得以执行。

    二、Dalvik与JVM的区别 很多人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时还要两个明显的不同:

    • Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式DEX(Dalvik Executable)。

    • 在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class)然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文 件中获取相应的字节码;Android应用虽然也是使用Java语言进行编程,但是在编译成CLASS文件后,还会通过一个工具(dx)将应用所有的 CLASS文件转换成一个DEX文件,而后Dalvik虚拟机会从其中读取指令和数据。

    Dalvik和Android系统Android作为新一代的基于Linux的开源手机操作系统,其系统架构由下而上可以分为以下几部分:

    • Linux内核

    • 本地库

    • Android运行库

    • 应用框架

    • 应用

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




    java虚拟机
     java虚拟机基于。 基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多dalvik虚拟机是基于寄存器
     java虚拟机运行的是java字节码。(java类会被编译成一个或多个字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar文件中获取相应的字节码)Dalvik运行的是自定义的.dex字节码格式。(java类被编译成.class文件后,会通过一个dx工具将所有的.class文件转换成一个.dex文件,然后dalvik虚拟机会从其中读取指令和数据)
      常量池已被修改为只使用32位的索引,以 简化解释器。dalvik的堆和栈的参数可以通过-Xms和-Xmx更改
      一个应用,一个虚拟机实例,一个进程(所有android应用的线程都是对应一个linux线程,都运行在自己的沙盒中,不同的应用在不同的进程中运行。每个android dalvik应用程序都被赋予了一个独立的linux PID(app_*))

    Dalvik和标准Java虚拟机(JVM)之间的首要差别之一,就是Dalvik基于寄存器,而JVM基于栈。
    Dalvik和Java之间的另外一大区别就是运行环境——Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik应用作为一个独立的Linux进程执行。
    (1)虚拟机很小,使用的空间也小;
    (2)Dalvik没有JIT编译器;
    (3)常量池已被修改为只使用32位的索引,以简化解释器;
    (4)它使用自己的字节码,而非Java字节码。

    Dalvik虚拟机架构:

    在android源码中,Dalvik虚拟机的实现位于“dalvik/”目录下,其中“dalvik/vm”是虚拟机的实现部分,将会编译成libdvm.so;而"dalvik/libdex"将会编译成libdex.a静态库作为dex工具;“dalvik/dexdump”是.dex文件的反编译工具;虚拟机的可执行程序位于“dalvik/dalvikvm”中,将会编译成dalvikvm可执行文件。

    dalvik虚拟机架构:


    Dalvik进程管理:

    dalvik进程管理是依赖于linux的进程体系结构的,如要为应用程序创建一个进程,它会使用linux的fork机制来复制一个进程(复制进程往往比创建进程效率更高)。

    Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,它通过init进程启动。首先会孵化出System_Server(android绝大多系统服务的守护进程,它会监听socket等待请求命令,当有一个应用程序启动时,就会向它发出请求,zygote就会FORK出一个新的应用程序进程).每当系统要求执行一个android应用程序时,Zygote就会运用linux的FORK进制产生一个子进程来执行该应用程序。

    JVM和Dalvik进程管理:

    linux中进程间通信的方式有很多,但是dalvik使用的是信号方式来完成进程间通信。

    Android的初始化流程


    三、Dalvik和Android系统

    Android作为新一代的基于Linux的开源手机操作系统,其系统架构由下而上可以分为以下几部分(Linux内核、本地库、Android运行库、应用框架、应用程序)

    如图所示:


    Android运行库包括两部分:核心库和Dalvik虚拟机。核心库包括了最基本的类库,如data structure,network, Utilities, File system等的,很多实现代码都是来自Apache Harmony项目,主要目的是保证虚拟机的类库能够和Java SE的类库最大可能的兼容,从而降低应用开发者从Java SE阵营转移到Android开发阵营的难度,增加其可用性。Dalvik虚拟机主要是完成对象生命周期的管理,堆栈的管理,线程管理,安全和异常的管理,以及垃圾回收等等重要功能。

    四、 Dalvik虚拟机的主要特征

    Dalvik虚拟机非常适合在移动终端上使用,相对于在桌面系统和服务器系统运行的虚拟机而言,它不需要很快的CPU速度和大量的内存空间。根据Google的测算,64M的RAM已经能够令系统正常运转了。其中24M被用于底层系统的初始化和启动,另外20M被用于高层启动高层服务。当然,随着系统服务的增多和应用功能的扩展,其所消耗的内存也势必越来越大。

    归纳起来,Dalvik虚拟机有如下几个主要特征:

    1) 专有的DEX文件格式

    DEX是Dalvik虚拟机专用的文件格式,而为什么弃用已有的字节码文件(CLASS文件)而采用新的格式呢?

    1. 一个应用中会定义很多类,编译完成后即会有很多相应的CLASS文件,CLASS文件间会有不少冗余的信息;而DEX文件格 式会把所有的CLASS文件内容整合到一个文件中。这样,除了减少整体的文件尺寸,I/O操作,也提高了类的查找速度。原来每个 类文件中的常量池,在DEX文件中由一个常量池来管理,具体方式如下图:


    2. 增加了新的操作码的支持

    3. 文件结构尽量简洁,使用等长的指令,借以提高解析速度

    4. 尽量扩大只读结构的大小,借以提高跨进程的数据共享

    如何生成DEX文件呢?Android系统和Dalvik虚拟机提供了工具(DX),在把Java源代码编译成CLASS文件后,使用DX工具。


    2) DEX的优化

    DEX文件的结构是紧凑的,然是如果我们还想要求运行时的性能有进一步提高,我们就仍然需要对DEX文件进行进一步优化。优化主要是针对以下几个方面:

    1. 调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的没一个域

    2. 验证DEX文件中的所有类

    3. 对一些特定的类进行优化,对方法里的操作码进行优化。优化后的文件大小会有所增加,应该是原DEX文件的1-4倍。优化发生的时机有两个:对于预置应用,可以在 系统编译后,生成优化文件,以ODEX结尾。这样在发布时除APK文件(不包含DEX)以外,还有一个相应的ODEX文件;对于非预置应用,包含在APK文件里的DEX文件会 在运行时被优化,优化后的文件将被保存在缓存中。

    3) 基于寄存器

    相对于基于堆栈的虚拟机实现,基于寄存器的虚拟机实现虽然在硬件通用性上要差一些,但是它在代码的执行效率上却更胜一筹。一般来讲,虚拟机中指令的解释执行时间主要花在以下三个方面:

    1. 分发指令

    2. 访问运算数

    3. 执行运算

    其中“分发指令”这个环节对性能的影响最大。在基于寄存器的虚拟机里,可以更为有效的减少冗余指令的分发和减少内存的读写访问,如:

    虽然Dalvik虚拟机并没有使用目前流行的虚拟机技术,如JIT,但是根据Google的报告,这个功能的缺失并没有另Dalvik虚拟机在性能上有所损失。我们也同时相信,Dalvik虚拟机的性能还有进一步提高的空间。

    4) 一个应用,一个虚拟机实例,一个进程

    每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制。

    不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的Linux用户来运行,可以最大程度的保护应用的安全和独立运行。

    Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时,Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。

    应用程序包(APK)被发布到手机上后,运行前会对其中的DEX文件进行优化,优化后的文件被保存到缓存区域(优化后的格式被称为DEY),虚拟机会直接执行该文件。如果应用包文件不发生变化,DEY文件不会被重新生成。

    五、Android应用开发和Dalvik虚拟机

    Android应用所使用的编程语言是Java语言,和Java SE一样,编译时使用Sun JDK将Java源程序编程成标准的Java字节码文件(.class文件),而后通过工具软件DX把所有的字节码文件转成DEX文件(classes.dex)。最后使用Android打包工具(aapt)将DEX文件,资源文件以及AndroidManifest.xml文件(二进制格式)组合成一个应用程序包(APK)。应用程序包可以被发布到手机上运行。


    展开全文
  • 反编译APK修改smali文件必备文档…… 有操作码、指令的详细说明以及示例 提供两个格式的,一个html的一个doc的,内容一样。
  • android Dalvik虚拟机

    千次阅读 2018-08-01 20:54:53
    在android5.0中,ART运行时取代了Dalvik虚拟机。虽然Dalvik虚拟机不再使用,但是它曾经的作用是不可磨灭的。因此,在研究ART运行时的垃圾收集机制之前,先理解Dalvik虚拟机的垃圾收集机制也是很重要和有帮助的。因此...

    转载自:https://blog.csdn.net/luoshengyang/article/details/41338251

    简介

    在android5.0中,ART运行时取代了Dalvik虚拟机。虽然Dalvik虚拟机不再使用,但是它曾经的作用是不可磨灭的。因此,在研究ART运行时的垃圾收集机制之前,先理解Dalvik虚拟机的垃圾收集机制也是很重要和有帮助的。因此,本文就对Dalvik虚拟机的垃圾收集机制进行简单介绍和指定学习计划。
    这里写图片描述
    Dalvik虚拟机用来分配对象的堆分为两部分,一部分叫Active Heap,另一部分叫做Zygote Heap。android系统的第一个Dalvik虚拟机是由Zygote进程创建的。应用进程是由Zygote进程fork出来的。也就是说,应用程序进程使用了一种写时拷贝技术来复制了Zygote进程的地址空间。这意味着一开始的时候,应用程序进程和Zygote进程共享了同一个用来分配对象的堆。然而,当Zygote进程或者应用程序进程对该堆进行写操作时,内核就会执行真正的拷贝操作,使得Zygote进程和应用程序进程分别拥有自己的一份拷贝。

    拷贝是一件费时费力的事情。因此,为了尽量地避免拷贝,Dalvik虚拟机将自己的堆划分为两部分。事实上,Dalvik虚拟机的堆最初是只有一个的。也就是Zygote进程在启动过程中创建Dalvik虚拟机的时候,只有一个堆。但是当Zygote进程在fork第一个应用程序进程之前,会将已经使用了的那部分堆内存划分为一部分,还没有使用的堆内存划分为另外一部分。前者就称为Zygote堆,后者就称为Active堆。以后无论是Zygote进程,还是应用程序进程,当它们需要分配对象的时候,都在Active堆上进行。这样就可以使得Zygote堆尽可能少地被执行写操作,因而就可以减少执行写时拷贝的操作。在Zygote堆里面分配的对象其实主要就是Zygote进程在启动过程中预加载的类、资源和对象了。这意味着这些预加载的类、资源和对象可以在Zygote进程和应用程序进程中做到长期共享。这样既能减少拷贝操作,还能减少对内存的需求。

    Dalvik虚拟机除了要给应用层分配对象之外,最重要的还是要对这些已经分配出去的对象进行管理,也就是要在对象不再被使用的时候,对其进行自动回收。自动回收对象的算法耳熟能详的Mark-Sweep算法。

    Mark-Sweep算法主要分为两个阶段:Mark和Sweep。Mark阶段从对象的根集开始标记被引用的对象。标记完成后,就进入到Sweep阶段,而Sweep阶段所作的事情就是回收没有被标记的对象占用的内存。那我们怎么标记对象有没有被引用的呢?换句话说就是通过什么数据结构来描述对象有没有被引用。我们使用Heap Bitmap。Heap Bitmap的结构如图3所示:
    这里写图片描述
    从名字可以推断出,Heap Bitmap使用位图来标记对象是否被使用。如果一个对象被引用,那么在Bitmap中与它对应的那一位就会被设置为1。否则的话,就设置为0。
    在图一中,我们使用了两个Bitmap来描述堆的对象,一个称为Live Bitmap,另一个称为Mark Bitmap。Live Bitmap用来标记上一次GC时被引用的对象,也就是没有被回收的对象,而Mark Bitmap用来标记当前GC有被引用的对象。有了这两个消息之后,我们就可以很容易地知道哪些对象是需要被回收的,即在Live Bitmap在标记位1,但是在Mark Bitmap中标记为0的对象。
    在垃圾收集的Mark阶段,要求除了垃圾收集线程之外,其他的线程都停止,否则的话,就会可能导致不能正确的标记每一个对象。这种现象在垃圾收集算法中称为Stop the world,会导致程序中止执行,造成停顿的现象。为了尽可能地减少停顿,我们必须要允许在Mark阶段有条件的允许程序的其他线程执行。这种垃圾收集算法称为并行垃圾收集算法。
    为了实现Concurrent GC,Mark阶段又划分为两个子阶段。第一个子阶段只负责标记根集对象。所谓的根集对象,就是指GC开始的瞬间,被全局变量、栈变量和寄存器等引用的对象。有了这些根集对象之后,我们就可以顺着它们找到其余的被引用变量。这个标记被根集对象引用的对象的过程就是第二个子阶段。在Concurrent GC,第一个子阶段是不允许垃圾收集线程之外的线程运行的,但是第二个子阶段是允许的。不过,在第二个子阶段执行的过程中,如果一个线程修改了对象,那么该对象必须要记录下来,因为他很有可能引用了新的对象。如果不这样的话,可能会导致被引用的对象还在使用然而却被回收。这种情况出现在只进行部分垃圾收集的情况,这时候Card Table的作用就是用来记录非垃圾收集堆对象对垃圾收集堆对象的引用。Dalvik虚拟机进行部分垃圾收集时,实际上就是只收集在Active堆上分配的对象。因此对Dalvik虚拟机来说,Card Table就是用来记录在Zygote堆上分配的对象对在Active堆上分配的对象的引用。
    我们是不是想到再用一个Bitmap在描述上述第二个子阶段被修改的对象呢?虽然我们尽大努力减少了用来标记对象的Bitmap的大小,不过还是比较乐观的。因此,为了减少内存的消耗,我们使用另外一种技术来标记第二子阶段被修改的对象。这种技术使用到了一种称为Card Table的数据结构,如下图:
    这里写图片描述

    Card Table是由Card组成,一个Card实际上就是一个字节,它的值要么是clean,要么是dirty。如果一个Card的值是Clean,就表示与它对应的对象在mark第二子阶段没有被程序修改过。否则,就意味着被程序修改过。对于这些被修改过的对象,需要在Mark第二子阶段结束之后,再次禁止垃圾收集线程之外的其他线程执行,以便垃圾收集线程再次根据Card Table记录的信息对被修改过的对象引用的其他对象进行重新标记。由于Mark 第二子阶段执行的时间不会太长,因此在该阶段被修改的对象不会很多,这样就可以保证第二次子阶段结束后,再次执行标记对象的过程是很快的,因而此时对程序造成的停顿非常小。

    GC触发时机

    1、调用函数dvmHeapSourceAlloc在java堆上分配指定大小的内存。如果分配成功,那么就将分配得到的地址直接返回给调用者了。函数dvmHeapSourceAlloc在不改变java堆当前大小前提下进行内存分配。函数dvmHeapSourceAlloc成功地在Active堆上分配到一个对象之后,就会坚持Active堆当前已经分配的内存是否大于预设的阈值。如果大于,那么就会通过条件变量gHs->gcThreadCond唤醒GC线程进行垃圾回收。预设的阈值是一个比指定的堆最小空闲内存小128K的数值,各手机厂商也会修改该值到一个合理的值。
    2、如果上一步内存分配失败,这时候就需要一次GC。GC线程时Dalvik虚拟机启动的过程中创建的,它的执行体函数是gcDaemonThread。不过如果GC线程已经在运行中,即gDvm.gcHeap->gcRunning的值等于true,那么就直接调用函数dvmWaitForConcurrentGcToComplete等到GC执行完成。否则的话,就需要调用函数gcForMalloc来执行一次GC_FOR_MALLOC的GC了,参数false表示不要回收软引用对象引用的对象。
    3、GC执行完毕之后,再次调用函数dvmHeapSourceAlloc尝试内存分配操作。如果分配成功,那么就将分配得到的地址直接返回给调用者了。
    4、如果上一步内存分配失败,这个时候就要对Java堆进行扩容了。通过调用函数dvmHeapSourceAllocAndGrow尝试分配,这个函数会扩张堆。所以dvmHeapStartup的时候可以给一个比较小的初始堆,实在不够用再调用它进行扩张。
    5、如果调用函数dvmHeapAourceAllocAndGrow分配内存成功,则直接将分配得到的地址直接返回给调用者了。
    6、如果上一步内存分配还是失败,这个时候就需要回收软引用了。再次调用函数gcForMalloc来执行GC。参数true表示要回收软引用对象引用的对象。
    7、GC执行完毕,再次调用函数dvmHeapSourceAllocAndGrow进行内存分配。这是最后一次努力了,如果失败,就抛出OOM。

    通过这个流程可以看出,在对象的分配中会导致GC,第一次分配对象失败我们会出发GC但是不回收软引用,如果再次分配还是失败就会对堆进行扩容(在堆的大小还没有达到最大值Maximum Size的情况下),并再次尝试分配,如果还是分配失败,就会将软引用内存也给回收。
    每次GC执行完成之后,都需要根据预先设置的目标堆利用率和已经分配出去的内存字节数计算得到理想的堆大小。已经分配出去的内存字节数只考虑在Active堆上分配出去的字节数。得到了Active堆已经分配出去的字节数currentHeapUsed之后,就可以调用函数getUtilizationTarget来计算Active堆的理想大小targetHeapSize了。计算出来的堆理想大小targetSize要满足空闲内存不能大于预先设定的最大值(hs->maxFree)以及不能小于预先设定的最小值(hs->minFree)。接下来同函数dvmHeapSourceAlloc成功地在Active堆上分配到一个对象一样,检查并行GC的触发条件。当Active堆heap当前已经分配的大小超过heap->concurrentStartBytes时,就会触发并行GC。计算并行GC触发条件时,需要用到CONCURRENT_MIN_FREE和CONCURRENT_START两个值,预设的CONCURRENT_MIN_FREE定义为256K,而CONCURRENT_START定义为128K。各厂商会根据手机设置合理的值如几百K。
    由此我们知道,在预设情况下,当Active堆允许分配的内存小于256K时,禁止执行并行GC,而当Active堆允许分配的内存大于等于256K,并且剩余的空闲内存小于128K就会触发并行GC。

    回收算法和内存碎片

    由于Mark and Sweep算法的缺点,容易导致内存碎片,所以在这个算法下,当我们有大量不连续小内存的时候,再分配一个较大的对象时,还是会非常容易导致GC,比如我们分配一个图片内存的时候。所以对于Dalvik虚拟机的手机来说,我们首先要尽量避免频繁生成很多临时小变量,另一个又要尽量去避免产生很多长声明周期的大对象。

    展开全文
  • 1 、Dalvik虚拟机介绍  Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行。dex格式是专门为Dalvik设计的一种压缩...

    1 、Dalvik虚拟机介绍

      Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行。dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Google对其进行了特定的优化,使得Dalvik具有高效、简洁、节省资源的特点。从Android系统架构图知,Dalvik虚拟机运行在Android的运行时库层。

    2、 Dalvik虚拟机的功能

      Dalvik作为面向Linux、为嵌入式操作系统设计的虚拟机,主要负责完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等。Dalvik充分利用Linux进程管理的特定,对其进行了面向对象的设计,使得可以同时运行多个进程,而传统的Java程序通常只能运行一个进程,这也是为什么Android不采用JVM的原因。Dalvik为了达到优化的目的,底层的操作大多和系统内核相关,或者直接调用内核接口。另外,Dalvik早期并没有JIT编译器,直到Android2.2才加入了对JIT的技术支持。

    3 、Dalvik虚拟机和Java虚拟机的区别

          本质上,Dalvik也是一个Java虚拟机。但它特别之处在于没有使用JVM规范。

    大多数Java虚拟机都是基于栈的结构,而Dalvik虚拟机则是基于寄存器。

    基于栈的指令很紧凑,例如,Java虚拟机使用的指令只占一个字节,因而称为字节码。

    基于寄存器的指令由于需要指定源地址和目标地址,因此需要占用更多的指令空间。Dalvik虚拟机某些指令需要占用两个字节。

    基于栈和基于寄存器的指令集各有优劣,一般而言,执行同样的功能,前者需要更多的指令(主要是load和store指令),而后者需要更多的指令空间。需要更多指令意味着要多占用CPU时间,而需要更多指令空间意味着数据缓冲(d-cache)更易失效。

      Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的是专有文件格式dex。在Java程序中,Java类会被编译成一个或多个class文件,然后打包到jar文件中,接着Java虚拟机会从相应的class文件和jar文件中获取对应的字节码。Android应用虽然也使用Java语言,但是在编译成class文件后,还会通过DEX工具将所有的class文件转换成一个dex文件,Dalvik虚拟机再从中读取指令和数据。dex文件除了减少整体的文件尺寸和I/O操作次数,也提高了类的查找速度。

    下图为流程区别:

    总的来说,Dalvik虚拟机具有以下特点:

    • 使用dex格式的字节码,不兼容Java字节码格式
    • 代码密度小,运行效率高,节省资源
    • 常量池只使用32位的索引
    • 有内存限制
    • 默认栈大小是12KB(3个页,每页4KB)
    • 堆默认启动大小为2MB,默认最大值为16MB
    • 堆支持的最小启动大小为1MB,支持的最大值为1024MB
    • 堆和栈参数可以通过-Xms和-Xmx修改
    展开全文
  • Dalvik虚拟机:是谷歌公司自己设计用于安卓平台的虚拟机,可以简单地完成进程隔离和管理线程,能一定程度上提高内存的使用效率。 java虚拟机:也就是JVM的运行平台,联系平时用的虚拟机,大概可以理解成JRE=虚拟机...

    Dalvik虚拟机:是谷歌公司自己设计用于安卓平台的虚拟机,可以简单地完成进程隔离和管理线程,能一定程度上提高内存的使用效率。

    java虚拟机:也就是JVM的运行平台,联系平时用的虚拟机,大概可以理解成JRE=虚拟机平台+虚拟机本体(JVM)。

    以上是对两个虚拟机的简单介绍

    下列总结两虚拟机的区别

    1、使用的目的不同。Dalvik用于安卓开发,JVM用于java开发

    2、文件格式不同。Java虚拟机(以下写作JVM)首先会将.java文件编译成.class文件,进一步会将.class文件打包成为.jar文件;而Dalvik虚拟机将.java文件编译成.class文件后,使用工具生成.dex文件或者进一步优化为odex文件

    3、架构不同。JVM是基于栈架构,栈是内存当中一个连续的内存空间;Dalvik是基于寄存器架构,寄存器是CPU当中的一块缓存。寄存器的存取速度要比内存的快很多。

    展开全文
  •  Java文件通过javac编译成.class文件,然后通过SDK中的dx工具将.class文件转换成Dalvik虚拟机能够执行的.dex文件,然后与Native code(JNI)和资源文件一起打包成apk,apk安装到手机后解压出.dex文件,Dalvik虚拟机会...
  • 文章目录1.Linux内核2.Dalvik虚拟机 1.Linux内核      Android系统采用分层结构,由高到低分为4层,依次是应用程序层,应用程序框架层,核心内库,Linux内核 应用程序层(Applications) ...
  • Dalvik虚拟机源码初探

    2020-07-22 20:59:51
    这是因为Dalvik虚拟机是可以运行在各种不同的平台之上,而每一种平台可能都定义有自己的一套函数调用规范, 也就是所谓的ABI(Application Binary Interface),这是一个API(Application Programming Interface)...
  • 为了减小执行文件的体积,安卓使用Dalvik虚拟机,SDK中有个dx工具负责将JAVA字节码转换为Dalvik字节码,dx工具对JAVA类文件重新排列,将所有JAVA类文件中的常量池分解,消除其中的冗余信息,重新组合形成一个常量池...
  • 进入 Android Dalvik 虚拟机,android dalvik介绍 Dalvik 虚拟机的特点——掌握 Android 程序的运行原理 Android 系统的架构采用分层思想,这样的好处是拥有减少各层之间的依赖性、便于独 立分发、容易收敛问题和...
  • Android Dalvik虚拟机结构及机制剖析 第2卷.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
  • Google于2007年底正式发布了Android SDK,Dalvik虚拟机也第一次进入了人们的视野。它的作者是丹.伯恩斯坦(Dan Bornstein)。Dalvik虚拟机作为Android平台的核心组件,拥有如下几个特点: 体积小,占用内存空间小...
  • Android Dalvik虚拟机结构及机制剖析 第2卷
  • Android上的Dalvik虚拟机

    2018-09-21 13:16:11
    本文会介绍Andorid系统上曾经使用过的Dalvik虚拟机。后面还会有一篇文章讲解Android系统上现在使用的虚拟机:ART。 另外,我的博客里有一篇关于Java虚拟机的预习文章也可以看一看:Java虚拟机与垃圾回收算法 也许有...
  • 安卓Dalvik虚拟机相关知识点总结Java虚拟机与Dalvik虚拟机的区别 Java虚拟机运行的是Java字节码(保存在class文件中),Dalvik运行的是Dalvik字节码(由Java字节码转化而来,打包到DEX文件中)。 Dalvik可执行文件更...
  • 是一本以情景方式对Android的源代码进行深入分析的书,内容广泛,主要从Dalvik虚拟机整体结构、获取和编译Dalvik虚拟机的源码、源码分析辅助工具使用、.dex文件及Dalvik字节码格式解析、Dalvik虚拟机下的系统工具...
  • Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,和在低速CPU上表现出的高性能,确实令人刮目相看。依赖于底层Posix兼容的操作...
  • 什么是Dalvik虚拟机? Dalvik VM与JVM有什么区别? Dalvik VM有什么新的特点? Dalvik VM的架构是怎么样的?     首先,我得承认第一个问题问得很傻:什么是Dalvik虚拟机?没有人给出过一个明确的定义,但是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,099
精华内容 12,839
关键字:

dalvik虚拟机