不同点

  • 内存堆的划分
  • 代码编译运行区别
  • GC

堆划

各个堆划分功能说明

堆说明
Zygote管理Zygote进程在启动过程中预加载和创建的各种对象
Active应用程序进程分配对象
Large分配大对象
Image存放一些预加载的类

Dalvik由于没有large的划分优化,GC回收算法又是Mark-Swap,会有很多内存碎片,分配大对象时,很容易GC.

代码编译运行区别

虚拟机处理方式
Dalvik <2.2Interpreter 将代码代码一条条的转译执行
Dalvik >=2.2JIT 将热点代码编译成机器指令
ArtAOT 安装时预先编译成机器码
Art >=NInterpreter+JIT+AOT

GC

都有并发和非并发收集过程 并发收集不同点

不同DalvikART
回收算法Mark-Sweep前台GC: Mark-Sweep
后台GC: Mark-Compact
StopWord时机标记 root
标记 dirty
标记 dirty
GC粒度划分无StickGc: Allock区
PartialGc: Alloct+Large
FullGc:Alloct+Large+Zygote

Dalvik 并发收集大概流程

  1. 挂起
  2. mark Root
  3. 恢复
  4. 并发mark Root持有的引用链
  5. 挂起
  6. mark dirty
  7. 恢复
  8. 回收

ART 并发收集大概流程

  1. 并发mark Root
  2. 并发mark Root持有的引用链
  3. 挂起
  4. mark dirty
  5. 恢复
  6. 回收

详细的收集过程参见 老罗的博客


参考: