精华内容
下载资源
问答
  • Dalvik虚拟机

    2020-12-10 11:15:22
    1.Dalvik虚拟机和java虚拟机的异同点 最显著曲边是他们分别具有不同的类文件格式以及指令集 a. Dalvik虚拟机执行的是dex(Dalvik Executable)格式的类文件,一个dex文件可包含若干个类,dex将各个类中重复的字符串...

    1.Dalvik虚拟机和java虚拟机的异同点

    最显著曲边是他们分别具有不同的类文件格式以及指令集

    a. Dalvik虚拟机执行的是dex(Dalvik Executable)格式的类文件,一个dex文件可包含若干个类,dex将各个类中重复的字符串和其他常数只保存一次,从而节省空间,适用于内存和处理器速度优先的手机系统;而Java虚拟机使用的是.class格式类文件,一个class文件只包含一个类;
    b. Dalvik虚拟机使用的指令是基于寄存器;Java虚拟机使用的指令集是基于堆栈的;各有优劣

    2.Dalvik虚拟机自身优化措施

    a. 将多个类文件合成到一个dex文件中,节省空间
    b. 使用只读内存映射方式加载dex文件,以便可以多进程共享dex文件,节省程序加载时间;
    c. 提前调整好字节序和字对齐方式,使得它们更适合本机机器,一遍提高指令执行速度;
    d. 尽量提前执行字节码校验,提高程序的加载速度;
    e. 需要重写字节码的优化要提前进行

    3.内存管理(重点)

    Dalvik虚拟机的内存大体上可以分为Java Object Heap、Bitmap Memory和Native Heap三种。

    Java Object Heap是用来分配Java对象的,也就是我们在代码new出来的对象都是位于Java Object Heap上的。Dalvik虚拟机在启动的时候,可以通过-Xms和-Xmx选项来指定Java Object Heap的最小值和最大值。为了避免Dalvik虚拟机在运行的过程中对Java Object Heap的大小进行调整而影响性能,我们可以通过-Xms和-Xmx选项来将它的最小值和最大值设置为相等。
    Java Object Heap的最小和最大默认值为2M和16M,但是手机在出厂时,厂商会根据手机的配置情况来对其进行调整,例如,G1、Droid、Nexus One和Xoom的Java Object Heap的最大值分别为16M、24M、32M 和48M。我们可以通过ActivityManager类的成员函数getMemoryClass来获得Dalvik虚拟机的Java Object Heap的最大值。
    ActivityManager类的成员函数getMemoryClass的实现如下所示:

    public class ActivityManager {  
        ......  
    
        /** 
         * Return the approximate per-application memory class of the current 
         * device.  This gives you an idea of how hard a memory limit you should 
         * impose on your application to let the overall system work best.  The 
         * returned value is in megabytes; the baseline Android memory class is 
         * 16 (which happens to be the Java heap limit of those devices); some 
         * device with more memory may return 24 or even higher numbers. 
         */  
        public int getMemoryClass() {  
            return staticGetMemoryClass();  
        }  
    
        /** @hide */  
        static public int staticGetMemoryClass() {  
    // Really brain dead right now -- just take this from the configured  
    // vm heap size, and assume it is in megabytes and thus ends with "m".  
    String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");  
    return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));  
        }  
    
        ......  
    }
    
    

    这个函数定义在文件frameworks/base/core/java/android/app/ActivityManager.java中。
    Dalvik虚拟机在启动的时候,就是通过读取系统属性dalvik.vm.heapsize的值来获得Java Object Heap的最大值的,而ActivityManager类的成员函数getMemoryClass最终也通过读取这个系统属性的值来获得Java Object Heap的最大值。

    这个Java Object Heap的最大值也就是我们平时所说的Android应用程序进程能够使用的最大内存。这里必须要注意的是,Android应用程序进程能够使用的最大内存指的是能够用来分配Java Object的堆。

    Bitmap Memory也称为External Memory,它是用来处理图像的。在HoneyComb之前,Bitmap Memory是在Native Heap中分配的,但是这部分内存同样计入Java Object Heap中,也就是说,Bitmap占用的内存和Java Object占用的内存加起来不能超过Java Object Heap的最大值。这就是为什么我们在调用BitmapFactory相关的接口来处理大图像时,会抛出一个OutOfMemoryError异常的原因:

    java.lang.OutOfMemoryError: bitmap size exceeds VM budget
    
    

    在HoneyComb以及更高的版本中,Bitmap Memory就直接是在Java Object Heap中分配了,这样就可以直接接受GC的管理。

    Native Heap就是在Native Code中使用malloc等分配出来的内存,这部分内存是不受Java Object Heap的大小限制的,也就是它可以自由使用,当然它是会受到系统的限制。但是有一点需要注意的是,不要因为Native Heap可以自由使用就滥用,因为滥用Native Heap会导致系统可用内存急剧减少,从而引发系统采取激进的措施来Kill掉某些进程,用来补充可用内存,这样会影响系统体验。

    此外,在HoneyComb以及更高的版本中,我们可以在AndroidManifest.xml的application标签中增加一个值等于“true”的android:largeHeap属性来通知Dalvik虚拟机应用程序需要使用较大的Java Object Heap。事实上,在内存受限的手机上,即使我们将一个应用程序的android:largeHeap属性设置为“true”,也是不能增加它可用的Java Object Heap的大小的,而即便是可以通过这个属性来增大Java Object Heap的大小,一般情况也不应该使用该属性。为了提高系统的整体体验,我们需要做的是致力于降低应用程序的内存需求,而不是增加增加应用程序的Java Object Heap的大小,毕竟系统总共可用的内存是固定的,一个应用程序用得多了,就意味意其它应用程序用得少了。

    3.垃圾收集(GC)

    Dalvik虚拟机可以自动回收那些不再使用了的Java Object,也就是那些不再被引用了的Java Object。垃圾自动收集机制将开发者从内存问题中解放出来,极大地提高了开发效率,以及提高了程序的可维护性。

    我们知道,在C或者C++中,开发者需要手动地管理在堆中分配的内存,但是这往往导致很多问题。例如,内存分配之后忘记释放,造成内存泄漏。又如,非法访问那些已经释放了的内存,引发程序崩溃。如果没有一个好的C或者C++应用程序开发框架,一般的开发者根本无法驾驭内存问题,因为程序大了之后,很容易造成失控。最要命的是,内存被破坏的时候,并不一定就是程序崩溃的时候,它就是一颗不定时炸弹,说不准什么时候会被引爆,因此,查找原因是非常困难的。

    从这里我们也可以推断出,Android为什么会选择Java而不是C/C++来作为应用程序开发语言,就是为了能够让开发远离内存问题,而将精力集中在业务上,开发出更多更好的APP来,从而迎头赶超iOS。当然,Android系统内存也存在大量的C/C++代码,这只要考虑性能问题,毕竟C/C++程序的运行性能整体上还是优于运行在虚拟机之上的Java程序的。不过,为了避免出现内存问题,在Android系统内部的C++代码,大量地使用了智能指针来自动管理对象的生命周期。选择Java来作为Android应用程序的开发语言,可以说是技术与商业之间一个折衷,事实证明,这种折衷是成功的。

    回到正题,在GingerBread之前,Dalvik虚拟使用的垃圾收集机制有以下特点:

    a. Stop-the-world,也就是垃圾收集线程在执行的时候,其它的线程都停止;
    Full heap collection,也就是一次收集完全部的垃圾;
    一次垃圾收集造成的程序中止时间通常都大于100ms。

    b. 在GingerBread以及更高的版本中,Dalvik虚拟使用的垃圾收集机制得到了改进,如下所示:
    Cocurrent,也就是大多数情况下,垃圾收集线程与其它线程是并发执行的;
    Partial collection,也就是一次可能只收集一部分垃圾;
    一次垃圾收集造成的程序中止时间通常都小于5ms。

    Dalvik虚拟机执行完成一次垃圾收集之后,我们通常可以看到类似以下的日志输出:

    D/dalvikvm(9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms
    
    

    在这一行日志中,GC_CONCURRENT表示GC原因,2049K表示总共回收的内存,3571K/9991K表示Java Object Heap统计,即在9991K的Java Object Heap中,有3571K是正在使用的,4703K/5261K表示External Memory统计,即在5261K的External Memory中,有4703K是正在使用的,2ms+2ms表示垃圾收集造成的程序中止时间

    4.即时编译(JIT)

    前面提到,JIT是相对AOT而言的,即JIT是在程序运行的过程中进行编译的,而AOT是在程序运行前进行编译的。在程序运行的过程中进行编译既有好处,也有坏处。好处在于可以利用程序的运行时信息来对编译出来的代码进行优化,而坏处在于占用程序的运行时间,也就是说不能花太多时间在代码编译和优化之上。
    为了解决时间问题,JIT可能只会选择那些热点代码进行编译或者优化。根据2-8原则,一个程序80%的时间可能都是在重复执行20%的代码。因此,JIT就可以选择这20%经常执行的代码来进行编译和优化。
    为了充分地利用好运行时信息来优化代码,JIT采用一种激进的方法。JIT在编译代码的时候,会对程序的运行情况进行假设,并且按照这种假设来对代码进行优化。随着程序的代码,如果前面的假设一直保持成立,那么JIT就什么也不用做,因此就可以提高程序的运行性能。一旦前面的假设不再成立了,那么JIT就需要对前面编译优化的代码进行调整,以便适应新的情况。这种调整成本可能是很昂贵的,但是只要假设不成立的情况很少或者几乎不会发生,那么获得的好处还是大于坏处的。由于JIT在编译和优化代码的时候,对程序的运行情况进行了假设,因此,它所采取的激进优化措施又称为赌博,即Gambling。

    Dalvik虚拟机从Android 2.2版本开始,才支持JIT,而且是可选的。在编译Dalvik虚拟机的时候,可以通过WITH_JIT宏来将JIT也编译进去,而在启动Dalvik虚拟机的时候,可以通过-Xint:jit选项来开启JIT功能。

    5.Java本地调用(JNI)

    无论如何,虚拟机最终都是运行在目标机器之上的,也就是说,它需要将自己的指令翻译成目标机器指令来执行,并且有些功能,需要通过调用目标机器运行的操作系统接口来完成。这样就需要有一个机制,使得函数调用可以从Java层穿越到Native层,也就是C/C++层。这种机制就称为Java本地调用,即JNI。当然,我们在执行Native代码的时候,有时候也是需要调用到Java函数的,这同样是可以通过JNI机制来实现。也就是说,JNI机制既支持在Java函数中调用C/C++函数,也支持在C/C++函数中调用Java函数。

    事实上,Dalvik虚拟机提供的Java运行时库,大部分都是通过调用目标机器操作系统接口来实现的,也就是通过调用Linux系统接口来实现的。例如,当我们调用android.os.Process类的成员函数start来创建一个进程的时候,最终会调用到linux系统提供的fork系统调用来创建一个进程。

    同时,为了方便开发者使用C/C++语言来开发应用程序,Android官方提供了NDK。通过NDK,我们就可以使用JNI机制来在Java函数中调用到C/C++函数。不过Android官方是不提倡使用NDK来开发应用程序的,这从它对NDK的支持远远不如SDK的支持就可以看得出来。

    6. 进程和线程管理

    别是考虑到多核的情况,因此,就完全没有必要在虚拟机中提供一个进程和线程库。

    Dalvik虚拟机运行在Linux操作系统之上。

    关于Android应用程序进程,它有两个很大的特点,下面我们就简要介绍一下。

    第一个特点是每一个Android应用程序进程都有一个Dalvik虚拟机实例。这样做的好处是Android应用程序进程之间不会相互影响,也就是说,一个Android应用程序进程的意外中止,不会影响到其它的Android应用程序进程的正常运行。

    第二个特点是每一个Android应用程序进程都是由一种称为Zygote的进程fork出来的。Zygote进程是由init进程启动起来的,也就是在系统启动的时候启动的。Zygote进程在启动的时候,会创建一个虚拟机实例,并且在这个虚拟机实例将所有的Java核心库都加载起来。每当Zygote进程需要创建一个Android应用程序进程的时候,它就通过复制自身来实现,也就是通过fork系统调用来实现。这些被fork出来的Android应用程序进程,一方面是复制了Zygote进程中的虚拟机实例,另一方面是与Zygote进程共享了同一套Java核心库。这样不仅Android应用程序进程的创建过程很快,而且由于所有的Android应用程序进程都共享同一套Java核心库而节省了内存空间。

    展开全文
  • Dalvik 虚拟机

    2019-09-25 20:05:57
    Dalvik 虚拟机介绍 Dalvik 虚拟机执行程序 JIT 转载于:https://www.cnblogs.com/hanhandaren/p/11095990.html
    • Dalvik 虚拟机介绍
    • Dalvik 虚拟机执行程序
    • JIT

     

     

     

     

     

     

    转载于:https://www.cnblogs.com/hanhandaren/p/11095990.html

    展开全文
  • 《Android Dalvik虚拟机结构及机制剖析:第1卷 Dalvik虚拟机结构剖析》是一本以情景方式对Android的源代码进行深入分析的书,内容广泛,主要从Dalvik虚拟机整体结构、获取和编译Dalvik虚拟机的源码、源码分析辅助...
  • Dalvik虚拟机是google专门为android平台开发的一个java虚拟机,但它并没有使用JVM规范。Dalvik虚拟机主要完成对象生命周期的管理、线程管理、安全和异常管理以及垃圾回收等重要功能。  java虚拟机和Dalvik虚拟机...

    Dalvik虚拟机是google专门为android平台开发的一个java虚拟机,但它并没有使用JVM规范。Dalvik虚拟机主要完成对象生命周期的管理、线程管理、安全和异常管理以及垃圾回收等重要功能。

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

      java虚拟机 Dalvik虚拟机
      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虚拟机架构:

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

      dalvik虚拟机架构:


    Android应用编译及运行流程:


     Dalvik进程管理:

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

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

     JVM和Dalvik进程管理的区别:

    ........

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

    最后,介绍下android的初始化流程图

    Android的初始化流程

    展开全文
  • 《Android Dalvik虚拟机结构及机制剖析 Dalvik虚拟机各模块机制分析 第2卷》
  • Android Dalvik虚拟机结构及机制剖析 Dalvik虚拟机各模块机制分析 第2卷
  • Google于2007年底正式发布了Android SDK,Dalvik虚拟机也第一次进入了人们的视野。它的作者是丹.伯恩斯坦(Dan Bornstein)。Dalvik虚拟机作为Android平台的核心组件,拥有如下几个特点: 体积小,占用内存空间小...

    Google于2007年底正式发布了Android SDK,Dalvik虚拟机也第一次进入了人们的视野。它的作者是丹.伯恩斯坦(Dan Bornstein)。Dalvik虚拟机作为Android平台的核心组件,拥有如下几个特点:

    • 体积小,占用内存空间小;

    • 专有的DEX可执行文件格式,体积更小,执行速度更快;

    • 常量池采用32位索引值,寻址类方法名,字段名,常量更快;

    • 基于寄存器架构,并拥有一套完整的指令系统;

    • 提供了对象生命周期管理,堆栈管理,线程管理,安全和异常管理以及垃圾回收等重要功能;

    • 所有的Android程序都运行在Android系统进程里,每个进程对应着一个Dalvik虚拟机实例。

    1. Dalvik虚拟机与Java虚拟机的区别

    Dalvik虚拟机与传统的Java虚拟机有着许多不同点,两者并不兼容,它们显著的不同点主要表现在以下几个方面:

    • Java虚拟机运行的是Java字节码,Dalvik虚拟机运行的是Dalvik字节码。传统的Java程序经过编译,生成Java字节码保存在class文件中,Java虚拟机通过解码class文件中的内容来运行程序。而Dalvik虚拟机运行的是Dalvik字节码,所有的Dalvik字节码由Java字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中。Dalvik虚拟机通过解释DEX文件来执行这些字节码。

    • Dalvik可执行文件体积小。Android SDK中有一个叫dx的工具负责将Java字节码转换为Dalvik字节码。dx工具对Java类文件重新排列,消除在类文件中出现的所有冗余信息,避免虚拟机在初始化时出现反复的文件加载与解析过程。一般情况下,Java类文件中包含多个不同的方法签名,如果其他的类文件引用该类文件中的方法,方法签名也会被复制到其类文件中,也就是说,多个不同的类会同时包含相同的方法签名,同样地,大量的字符串常量在多个类文件中也被重复使用。这些冗余信息会直接增加文件的体积,同时也会严重影响虚拟机解析文件的效率。消除其中的冗余信息,重新组合形成一个常量池,所有的类文件共享同一个常量池。由于dx工具对常量池的压缩,使得相同的字符串,常量在DEX文件中只出现一次,从而减小了文件的体积。

    • Java虚拟机与Dalvik虚拟机架构不同。Java虚拟机基于栈架构,程序在运行时虚拟机需要频繁的从栈上读取或写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费不少CPU时间,对于像手机设备资源有限的设备来说,这是相当大的一笔开销。Dalvik虚拟机基于寄存器架构。数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。测试代码如下:

    package t1;
    
    public class Hello {
        public static void main(String[] args) {
            Hello hello = new Hello();
            System.out.println(hello.foo(5, 3));
        }
        public int foo(int a,int b) {
            return (a + b) * (a - b);
        }
    }

     

    将以上内容保存为Hello.java。打开命令提示符,执行命令:

    $ javac -source 1.6 -target 1.6 Hello.java

     

    :如果使用1.7及以上版本的JDK编译Hello.java,生成Hello.class默认的版本会比较低,使用dx生成dex文件会提示class文件无效。解决方法是强制指定class文件的版本。

    继续上面的讨论,执行上面的命令生成Hello.class文件。然后执行命令:

    ./dx --dex --output=t1/Hello.dex t1/Hello.class

     

    执行上面的命令前,命令行进入到dx工具所在的目录(位于Android SDK的platform-tools目录中),再把t1/Hello.class目录与文件copy到dx工具所在的目录,然后再执行上面的命令生成dex文件。

    接下来在Hello.class所在目录使用javap反编译Hello.class查看foo()函数的Java字节码,执行以下命令:

    $ javap -c -cp . Hello.class

     

    命令执行后得到如下代码(foo()函数部分):

    public int foo(int, int);
        Code:
           0: iload_1
           1: iload_2
           2: iadd
           3: iload_1
           4: iload_2
           5: isub
           6: imul
           7: ireturn

     

    下面再使用dexdump(位于Android sdk的platform-tools目录中)查看foo()函数的Dalvik字节码,执行以下命令:

    $ ./dexdump -d t1/Hello.dex

     

    命令执行后整理输出结果,可以得到如下代码(foo()函数部分):

    000198:                                             |[000198] t1.Hello.foo:(II)I
    0001a8: 9000 0304                                   |0000: add-int v0, v3, v4
    0001ac: 9101 0304                                   |0002: sub-int v1, v3, v4
    0001b0: b210                                        |0004: mul-int/2addr v0, v1
    0001b2: 0f00                                        |0005: return v0

     

    查看上面的Java字节码,发现foo()函数一共占用了8个字节,代码中每条指令占用1个字节。比起Java虚拟机字节码,上面的Dalvik字节码显得简洁很多,只有4条指令就完成了下面的操作。

    通过上面的分析 可以发现,基于寄存器架构的Dalvik虚拟机与基于栈架构的Java虚拟机相比,由于生成的代码指令减少了,程序执行速度会更快一些。

    2. Dalvik虚拟机是如何执行程序的

    Android系统由Linux内核,函数库,Android运行时,应用程序框架以及应用程序组成。Dalvik虚拟机属行Android运行时环境,它与一些核心库共同承担Android应用程序的运行工作。

    Android系统启动加载完内核后,第一个执行的是init进程,init进程首先要做的是设备的初始化工作,然后读取inic.rc文件并启动系统中的重要外部程序 Zygote。Zygote进程是Android所有进程的孵化器进程,它启动后会首先初始化Dalvik虚拟机,然后启动system_server并进入Zygote模式,通过socket等候命令。当执行一个Android应用程序时,system_server进程通过Binder IPC方式发送命令给Zygote,Zygote收到命令后通过fork自身创建一个Dalvik虚拟机的实例来执行应用程序的入口函数,这样一个程序就启动完成了。

    Zygote提供了三种创建进程的方法:

    • fork(),创建一个Zygote进程(这种方式实际不会被调用)

    • forkAndSpecialize(),创建一个非Zygote进程

    • forkSystemServer(),创建一个系统服务进程。

    其中,Zygote进程可以再fork()出其他进程,非Zygote进程则不能fork其他进程,而系统服务进程在终止后它的子进程也必终止。当进程fork成功后,执行的工作就交给了Dalvik虚拟机。Dalvik虚拟机首先通过loadClassFromDex()函数完成类的装载工作,每个类被成功解析后都会拥有一个ClassObject类型的数据结构存储在运行时环境中,虚拟机使用gDvm.loadedClasses全局哈希表来存储与查询所有装载进来的类,随后,字节码验证器使用dvmVerifyCodeFlow()函数对装入的代码进行校验,接着虚拟机调用FindCass()函数查找并装载main方法类,随后调用dvmInterpret()函数初始化解释器并执行字节码流。

    3. 关于Dalvik虚拟机JIT(即时编译)

    JIT(Just-in-time Compilation,即时编译),又称为动态编译,是一种通过在运行时将字节码翻译为机器码的技术,使得程序的执行速度更快。Android2.2版本系统的Dalvik虚拟机引入了JIT技术,官方宣称新版的Dalvik虚拟机比以往执行速度快3~6倍。主流的JIT包含两种字节码编译方式:

    • method方式:以函数或方法为单位进行编译。

    • trace方式:以trace为单位进行编译。

    method方式很好理解,那什么是trace方式呢?在函数中一般很少是顺序执行代码的,多数的代码都分成了好几条执行路径,其中函数的有些路径在实际运行过程中是很少被执行的,这部分路径被称为“冷路径”,而执行比较频繁的路径被称为“热路径”。采用传统的method方式会编译整个方法的代码,这会使得在“冷路径”上浪费很多编译时间,并且耗费更多的内存;trace方法编译则能够快速地获取“热路径”代码,使用更短的时间与更少的内存来编译代码。

    目前,Dalvik虚拟机默认采用trace方式编译代码,同时也支持采用method方式来编译。

    原文:https://my.oschina.net/fhd/blog/365256

    展开全文
  • Dalvik虚拟机 PPT版

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

    2011-06-16 17:31:00
    什么是Dalvik虚拟机? Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,和在低速CPU上表现出的高性能,确实令人刮目相看。依赖于...
  • Dalvik虚拟机与Java虚拟机有着很多相似的特性,都支持GC,JIT,JNI等等。其主要区别在于文件格式以及指令集不同,下面对两者的特性进行比较与讨论。Difference1:文件格式Dalvik的虚拟机类文件采用dex格式,而JVM的类...
  • Dalvik虚拟机作为Android平台的核心组件,拥有如下几个特点:体积小,占用内存空间小;专有的DEX可执行文件格式,体积更小,执行速度更快;常量池采用32位索引值,寻址类方法名、字段名、常量更快;基于寄存器架构,...
  • Dalvik虚拟机

    2010-07-28 15:17:00
    Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,和在低速CPU上表现出的高性能,确实令人刮目相看。依赖于底层Posix兼容的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,229
精华内容 2,091
关键字:

dalvik虚拟机