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

    2013-03-05 09:06:26
    Dalvik虚拟机内存管理
  • 概述 这篇笔记摘抄自老罗的博客: http://blog.csdn.net/luoshengyang/article/details/41338251 ...Dalvik虚拟机内存分配的底层依赖是基于Doug Lea编写的dlmalloc内存分配器的,在Heap上完成。按照分配规...

    概述

    这篇笔记摘抄自老罗的博客:
    http://blog.csdn.net/luoshengyang/article/details/41338251
    http://blog.csdn.net/luoshengyang/article/details/41822747
    Dalvik虚拟机内存分配的底层依赖是基于Doug Lea编写的dlmalloc内存分配器的,在Heap上完成。按照分配规则,没进行一次内存分配都会经过数次尝试:
    1. 第一次分配,如果失败,那么进行一次GC,这次GC不回收软引用对象。
    2. 第二次分配,如果失败,就增长堆的大小,堆的大小是可以在堆的生长限制之内进行生长的。
    3. 第三次分配,如果失败,再进行一次GC,这次GC会收集软引用对象。
    4. 第四次分配,如果成功,则返回一个指向内存区域的指针,否则,如果失败,返回空指针并且抛出异常,虚拟机暂停工作。

    而在Dalvik虚拟机中,用来分配对象的堆划分为两个部分,一部分叫做Active Heap,另一部分叫做Zygote Heap。


    垃圾收集的过程

    Dalvik中GC的一些数据结构:

    三种情况
    struct GcSpec {  
      /* If true, only the application heap is threatened. */  
      bool isPartial;  
      /* If true, the trace is run concurrently with the mutator. */  
      bool isConcurrent;  
      /* Toggles for the soft reference clearing policy. */  
      bool doPreserve;  
      /* A name for this garbage collection mode. */  
      const char *reason;  
    };  
    1. isPartial:为true时表示仅回收Active堆的垃圾,为false时表示回收Active堆和Zygote堆的垃圾。
    2. isConcurrent:为true时表示执行并行GC,为false时表示执行非并行GC。
    3. doPreserve:为true时,表示在执行GC过程中,不回收软引用的对象,为false时表示回收软引用的对象。

    4. reason:一个描述性的字符串。

    四种类型GC
    /* Not enough space for an "ordinary" Object to be allocated. */  
    extern const GcSpec *GC_FOR_MALLOC;  
    
    /* Automatic GC triggered by exceeding a heap occupancy threshold. */  
    extern const GcSpec *GC_CONCURRENT;  
    
    /* Explicit GC via Runtime.gc(), VMRuntime.gc(), or SIGUSR1. */  
    extern const GcSpec *GC_EXPLICIT;  
    
    /* Final attempt to reclaim memory before throwing an OOM. */  
    extern const GcSpec *GC_BEFORE_OOM;  
    
    1. GC_FOR_MALLOC:表示是在堆上分配对象时内存不足触发的GC。
    2. GC_CONCURRENT:表示是在已分配内存达到一定量之后触发的GC。
    3. GC_EXPLICCT:表示是应用程序调用System.gc、VMRuntime.gc接口或者收到SIGUSR1信号时触发的GC。
    4. GC_BEFORE_OOM:表示是在准备抛OOM异常之前进行的最后努力而触发的GC。

    怎样知道哪些对象需要被回收

    在GC时,使用位图来存放对象的存活信息。如果一个对象被引用,那么它在Bitmap中与它对应的那一位就会被置为1,否则的话就是0。在Dalvik虚拟机中,使用一个unsigned long数组来描述一个Bitmap。
    在GC时,DVM使用两个Bitmap来描述堆的对象,一个称为Live Bitmap,另一个称为Mark Bitmap。Live Bitmap用来标记上一次GC时被引用的对象,也就是没有被回收的对象。而Mark Bitmap用来标记当前GC有被引用的对象。有了这两个信息之后,我们就可以很容易的知道哪些对象是需要被回收的,即在Live Bitmap中标记为1,但是在Mark Bitmap中标记为0的对象。

    这里有个要注意的,一开始没想明白为什么要对比Live Bitmap和Mark Bitmap,为什么不能直接扫描Mark Bitmap,为0的就是要回收的。想了一会才想通,在Mark Bitmap中会对存活的对象置1,而未分配的内存与应回收的内存,都是0,而未分配的内存是不需要进行回收的。因此可以通过对比Live Bitmap和Mark Bitmap获取到需要回收的对象是哪些。


    CMS(Concurrent Mark Sweep)收集器

    CMS是一种以获取最短回收停顿时间为目标的收集器。整个过程分为4个步骤,包括:
    1. 初始标记(CMS initial mark)
    2. 并发标记(CMS concurrent mark)
    3. 重新标记(CMS remark)
    4. 并发清除(CMS concurrent sweep)

    展开全文
  • 采有情景分析的方式对Android Dalvik虚拟机的源代码进行了有针对性的分析,围绕类加载、解释器、即时编译、本地方法调用、内存管理及反射机制等功能模块展开分析,主要帮助读者从微观上更深入地理解Dalvik虚拟机中各...
  • 一、Dalvik 虚拟机简介、 二、CPU 指令集、 三、Dalvik 虚拟机内存





    一、Dalvik 虚拟机简介



    Android 5.0 5.0 5.0 之前使用的是 Dalvik 虚拟机 , 5.0 5.0 5.0 之后使用的是 ART 虚拟机 ;

    Dalvik 虚拟机 也是 Java 虚拟机的一种 , 但是其没有获得 Sun 的测试审核 , 经过 Sun 公司测试 , 审核 , 授权后 , 虚拟机才能叫做 Java 虚拟机 , 只是名字上有区别 , 但是其还是符合 JVM 规范的 ;

    同理 , 手机厂商必须经过 Google 测试审核之后 , 才能叫 Android 手机 ;


    Dalvik 虚拟机 的 内存结构 , 与 JVM 有一定的区别 ;

    • JVM 主要在 PC 端使用 , 运行在 x86 架构 CPU 上 ;
    • DVM 主要是在手机端使用 , 运行在 arm 架构 CPU 上 , DVM 的内存优化比较高 ;




    二、CPU 指令集



    不同架构上的 Java 虚拟机 实现也是不同的 ;

    CPU 架构参考 【C 语言】CPU 架构 ( CPU 指令集类型 | CPU 指令类型 | CPU 架构 )

    • RISC : Reduced Instruction Set Computers , 精简指令集 , 手机使用的 ARM 芯片 ( 高通 ) 就是精简指令集 , Android 是基于 ARM 架构的操作系统 ;

    • CISC : Complex Instruction Set Computers , 复杂指令集 , PC 机的 x86 架构 CPU ( Intel , AMD ) 就是复杂指令集 ; Linux , Windows 是基于 x86 架构的操作系统 ;


    复杂指令集示例 : 复杂指令集中 , 所有的动作都是定义好的 ,

    • 以做菜为例 : 洗菜 , 切菜 , 炒菜 , 放调料 , 装盘 ; 将所有步骤定义好 ; 只要 5 5 5 个指令 , 就可以完成 ;
    • 运行速度高 , 效率高 , 功耗低 ;

    精简指令集示例 : 精简指令集中 , 只有最基础的指令 , 复杂指令需要自己合成 ;

    • 以做菜为例 : 洗菜 ( 放水 , 放菜 , 搅拌 , 沥干 ) , 切菜 ( 准备案板 , 准备菜刀 , 切片 ) , 炒菜 ( 起锅 , 烧油 ) , 放调料 ( 放花生油 , 放酱油 , 放盐 ) , 装盘 ( 准备盘子 , 从锅里倒在盘子中 ) ; 需要 14 14 14 个指令 , 才能完成 ;
    • 需要为每个步骤输入指令 , 速度慢 , 效率低 , 功耗高 ;

    CPU 位数 : 64 / 32 64 / 32 64/32 位 , 表示单次读取指令的吞吐量 , 64 64 64 位表示一次可以读取 64 64 64 位 ( 8 8 8 Byte ) 的指令 ;





    三、Dalvik 虚拟机内存



    DVM 堆分为 2 2 2 部分 , Active HeapZygote Heap ;

    Android 系统刚启动的时候 , 没有启动应用 , 只有 Zygote 进程 , 所有的应用都是 Zygote 进程 fork() 启动的 ;

    Zygote Heap 就是 Zygote 进程的堆 ;

    当有第一个 Android 应用进程启动后 , 就会出现 Active Heap 堆 ;

    在这里插入图片描述


    DVM 内存划分 :

    • Zygote Heap 堆内存中 , 有一部分区域的内存是只读的 , 如系统相关的库 , 共享库 , 预置库 , 这些内存数据所有应用公用 ;

    • 每个应用都会在 Active Heap 堆中分配一块内存 ;


    DVM 借助一些 辅助数据结构 管理堆内存 ;

    • Card Table : 记录对象的引用情况 , 辅助 CMS 并行垃圾回收器使用 ;
    • Live Heap Bitmap : 记录上一次 GC 后存活的对象 ;
    • Mark Heap Bitmap : 记录当前存活的对象 ;

    上一次存活 , 本次没有存活的对象 , 是本次需要被回收的对象 ; 这些对象由 Mark Stack 找出 ;

    Mark Stack 检索所有的引用对象 , 检查哪些对象需要被回收 ;

    展开全文
  • Dalvik虚拟机 PPT版

    千次下载 热门讨论 2013-10-23 01:26:13
    Android应用程序是运行在...这个PPT讲Dalvik虚拟机内存管理、垃圾收集、即时编译、Java本地调用、进程和线程管理等。理解Dalvik虚拟机的上述实现细节,有助于在运行时修改程序的行为,例如,拦截Java函数的调用。
  • Dalvik虚拟机内存分为三种类型: Java Object Heap, Bitmap Memory, Native Heap. 下面,就这三种类型进行详细讲解: 一. Java Object Heap: Java Object Heap是用来分配Java对象的,代码中new出来的Java...

        Dalvik虚拟机的内存分为三种类型: Java Object Heap,    Bitmap Memory,   Native Heap.    下面,就这三种类型进行详细讲解:

          

        一.    Java Object Heap:

         Java Object Heap是用来分配Java对象的,代码中new出来的Java对象都在Java Object Heap中。 Java Object Heap最小值和最大值默认是2M和16M, 不过不同的手机可能设置不同的值。  在SDK中的ActivityManager, 使用getMemoryClass来获取本机的最大值。

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


       二.    Bitmap Memory:

         BitmapMemory 也称为External Memroy ,是用来处理图像的。 在Android3.1之前,BitmapMemory是在Native Heap中进行分配, 但是这部分内存同样计入到了Java ObjectHeap中 。在3.1之后的版本中, BitmapMemory直接在Java Object Heap中进行分配,可以接收GC管理了。

      

         .    Native Heap:

           在Android Native Code中使用malloc分配出来的内存,就是Native Heap.   这部分内存不受Java Object Heap限制,可以自由使用,但是会受到系统限制。


            在Android3.1以及更高的版本中,我们可以在AndroidManifest.xml的application标签中增加一个值等于“true”的android:largeHeap属性来通知Dalvik虚拟机应用程序需要使用较大的Java Object Heap。事实上,在内存受限的手机上,即使我们将一个应用程序的android:largeHeap属性设置为“true”,也是不能增加它可用的Java Object Heap的大小的,而即便是可以通过这个属性来增大Java Object Heap的大小,一般情况也不应该使用该属性。


         注: 参考文章 http://blog.csdn.net/luoshengyang/article/details/8852432

     

    转载于:https://www.cnblogs.com/xinyuyuanm/p/3206529.html

    展开全文
  • 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虚拟机:是谷歌公司自己设计用于安卓平台的虚拟机,可以简单地完成进程隔离和管理线程,能一定程度上提高内存的使用效率。 java虚拟机:也就是JVM的运行平台,联系平时用的虚拟机,大概可以理解成JRE=虚拟机...
  • 1 、Dalvik虚拟机介绍  Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行。dex格式是专门为Dalvik设计的一种压缩...
  • 为了减小执行文件的体积,安卓使用Dalvik虚拟机,SDK中有个dx工具负责将JAVA字节码转换为Dalvik字节码,dx工具对JAVA类文件重新排列,将所有JAVA类文件中的常量池分解,消除其中的冗余信息,重新组合形成一个常量池...
  • android Dalvik虚拟机

    千次阅读 2018-08-01 20:54:53
    在android5.0中,ART运行时取代了Dalvik虚拟机。虽然Dalvik虚拟机不再使用,但是它曾经的作用是不可磨灭的。因此,在研究ART运行时的垃圾收集机制之前,先理解Dalvik虚拟机的垃圾收集机制也是很重要和有帮助的。因此...
  • Dalvik虚拟机作为Android平台的核心组件,拥有如下几个特点:体积小,占用内存空间小;专有的DEX可执行文件格式,体积更小,执行速度更快;常量池采用32位索引值,寻址类方法名、字段名、常量更快;基于寄存器架构,...
  • Dalvik虚拟机

    2016-08-08 19:53:01
    一、什么是Dalvik? Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。...每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例, 其代码在
  • 为了保证Android系统的正常运行和应用程序的稳定性,Dalvik虚拟机内存管理机制在整个虚拟机系统中占用非常重要的位置。此文章会解决以下五个问题: 1.内存管理机制中涉及的关键数据结构 2.内存管理机制中涉及到...
  • 现在看一篇关于安卓应用内部权限分离机制的论文,其中提到了dalvik虚拟机中的stackinspection,但对dalvik虚拟机并不是很熟悉,打算一步步补充学习下。今天先来学习一下内存管理之堆与栈——heap &stack。​其实...
  • 什么是Dalvik虚拟机

    千次阅读 2014-11-27 18:54:45
    Google于2007年底正式发布了Android SDK,作为Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,和在低速CPU上表现出的高性能,确实令人刮目相看。依赖于底层Posix兼容的操作...
  • Dalvik虚拟机内存分为三种类型: Java Object Heap, Bitmap Memory, Native Heap. 下面,就这三种类型进行详细讲解:一. Java Object Heap: Java Object Heap是用来分配Java对象的,代码中new出来的Java对象都在...
  • 现在看一篇关于安卓应用内部权限分离机制的论文,其中提到了dalvik虚拟机中的stackinspection,但对dalvik虚拟机并不是很熟悉,打算一步步补充学习下。今天先来学习一下内存管理之堆与栈——heap &stack。​其实...
  • 我们知道,在Android系统中,Dalvik虚拟机是运行Linux内核之上的。如果我们把Dalvik虚拟机看作是一台机器,那么它也有进程和线程的概念。事实上,我们的确是可以在Java代码中创建进程和线程,也就是Dalvik虚拟机进程...
  • java虚拟机和Dalvik虚拟机的区别:java虚拟机Dalvik虚拟机java虚拟机基于栈。基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多dalvik虚拟机是基于寄存器的java虚拟机运行的是java字节码。(java类会...
  • 本文主要介绍java虚拟机和Dalvik虚拟机的区别 ,参考文章http://www.cnblogs.com/carlo/p/4947763.html 哈哈请看文章!
  • JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平台的...
  • 准备进入安卓开发的行列,开始几篇基础文章的总结,获取并不怎么针对开发应用...(1)Android系统可以简单地完成进程隔离和线程管理,每一个Android应用都在底层会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的...
  • Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,和在低速CPU上表现出的高性能,确实令人刮目相看。依赖于底层Posix兼容的操作...
  • Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,和在低速CPU上表现出的高性能,确实令人刮目相看。 依赖于底层Posix兼容的操作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,481
精华内容 5,792
热门标签
关键字:

dalvik虚拟机内存管理