zoukankan      html  css  js  c++  java
  • Dalvik和ART

    --摘自《Android进阶解密》

    DVM和ART都是在Zygote进程中诞生的

    *DVM和JVM的区别*

    1.基于的架构不同

       DVM是基于寄存器的,它没有基于栈的虚拟机在复制数据时而使用的大量的出入栈指令,同时指令更紧凑、更简洁。但是由于显式指定了操作数,所以基于寄存器的指令会比基于栈的指令要大,但是由于指令数量的减少,总的代码数不会增加多少

    2.执行的字节码不同

      JVM执行顺序:.java文件-->.class文件-->.jar文件

      DVM执行顺序:.java文件-->.class文件-->.dex文件

      .apk文件中只包含了一个.dex文件,这个.dex文件将所有的.class里面所包含的信息全部整合在一起了,这样再加载就加快了速度

    3.DVM允许在有限的内存中同时运行多个进程

    4.DVM由Zygote创建和初始化

    5.DVM有共享机制

      不同应用之间在运行时可以共享相同的类,拥有更高的效率,而JVM机制不存在这种共享机制

    6.DVM早期没有使用JIT编译器,Android 2.2之后开始使用JIT

    *DVM架构*

    1.首先Java编译器编译的.class文件经过DX工具转换成.dex文件,.dex文件由类加载器处理,接着解释器根据指令集对Dalvik字节码进行解释、执行,最后交于Linux处理

    2.DVM的运行时堆使用标记--清除算法进行GC

    3.DVM引起GC的原因

      1)GC_CONCURRENT:当堆开始填充时,并发GC可以释放内存

      2)GC_FOR_MALLOC:当堆内存已满时,App尝试分配内存而一起的GC,系统必须停止App并回收内存

      3)GC_HPROF_DUMP_HEAP:当你请求创建HPROF文件来分析堆内存时出现的GC

      4)GC_EXPLICIT:显式的GC,例如调用System.gc()(应该避免调用显式的GC,信任GC会在需要时运行)

      5)GC_EXTERNAL_ALLOC:仅适用于API级别小于等于10,且用于外部分配内存的GC

    *ART与DVM的区别*

    1.ART系统在安装应用程序时会进行一次AOT(预编译),Android 7.0版本的ART加入了JIT,作为AOT的一个补充,在应用程序安装时并不会将字节码全部编译成机器码,而是在运行中将热点代码编译成机器码,从而缩短应用程序的安装时间并节省了存储空间

    2.DVM为32位CPU设计,ART支持64位并兼容32位CPU

    3.ART对垃圾回收机制进行了改进,比如更频繁地执行并行垃圾收集

    4.ART的运行时堆空间划分和DVM不同

    *ART引起GC的原因*

    1.Concurrent:并发GC,不会使App的线程暂停,该GC是在后台线程运行的,并不会阻止内存分配

    2.Alloc:当堆内存已满时,App尝试分配内存而引起的GC,这个GC会发生在正在分配内存的线程中

    3.Explicit:App显示的请求垃圾收集

    4.NativeAlloc:Native内存分配时,比如为Bitmaps或者RenderScrept分配对象,这会导致Native内存压力,从而触发GC

    5.CollectorTransiton:由堆转换引起的回收,这是运行时切换GC而引起的

    6.HomegeneousSpaceCompact:齐性空间压缩是指空闲列表到压缩的空闲列表空间,通常发生在当App已经移动到可察觉的暂停进程状态时

    7.DisableMovingGc:发生并发堆压缩时,由于使用了GetPrimitiveArrayCritical,收集会被阻塞

    8.HeapTrim:收集会一直被阻塞,直到堆内存整理完毕

    欢迎关注我的微信公众号:安卓圈

  • 相关阅读:
    python函数收集不确定数量的值
    PHP比较数组、对象是否为空
    PHP实现斐波那契数列
    Python之复制列表
    1004. 最大连续1的个数 III(滑动窗口)
    276. 栅栏涂色(动态规划)
    376. 摆动序列
    148. 排序链表
    143. 重排链表
    1530. 好叶子节点对的数量
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/10216234.html
Copyright © 2011-2022 走看看