不同点
- 内存堆的划分
- 代码编译运行区别
- GC
堆划
各个堆划分功能说明
堆 | 说明 |
---|---|
Zygote | 管理Zygote进程在启动过程中预加载和创建的各种对象 |
Active | 应用程序进程分配对象 |
Large | 分配大对象 |
Image | 存放一些预加载的类 |
Dalvik由于没有large的划分优化,GC回收算法又是Mark-Swap,会有很多内存碎片,分配大对象时,很容易GC.
代码编译运行区别
虚拟机 | 处理方式 |
---|---|
Dalvik <2.2 | Interpreter 将代码代码一条条的转译执行 |
Dalvik >=2.2 | JIT 将热点代码编译成机器指令 |
Art | AOT 安装时预先编译成机器码 |
Art >=N | Interpreter+JIT+AOT |
GC
都有并发和非并发收集过程
并发收集不同点
不同 | Dalvik | ART |
---|---|---|
回收算法 | Mark-Sweep | 前台GC: Mark-Sweep 后台GC: Mark-Compact |
StopWord时机 | 标记 root 标记 dirty |
标记 dirty |
GC粒度划分 | 无 | StickGc: Allock区 PartialGc: Alloct+Large FullGc:Alloct+Large+Zygote |
Dalvik 并发收集大概流程
- 挂起
- mark Root
- 恢复
- 并发mark Root持有的引用链
- 挂起
- mark dirty
- 恢复
- 回收
ART 并发收集大概流程
- 并发mark Root
- 并发mark Root持有的引用链
- 挂起
- mark dirty
- 恢复
- 回收
详细的收集过程参见 老罗的博客
参考: