Dalvik和ART

Dalvil(DVM)和ART都是适用于安卓平台的虚拟机,但是不属于Java虚拟机。

DVM和JVM(java虚拟机)的区别有:

1.基于的架构不同

2.执行的字符码不同(JVM是加载  .jar文件,DVM是  .dex文件,加载速度更快)

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

4.DVM由Zygote创建和初始化

5.DVM早期不使用JIT编译器

6.DVM在不同的应用之间可以共享相同的类,拥有更高的效率。(有共享机制)

DVM的运行时堆由两个Space以及多个辅助数据结构组成,两个Space分别是:Zygote Space和Allocation Space。Zygote Space用来管理Zygote进程在启动过程中预加载和创建的各种对象。Allocation Space分配和释放对象。

引起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是Dalvik的替代者,他比DVM效率运行效率更高。但是也有两个缺点,因为他会预编译,所以安装应用程序的时间变长了,而且会占用存储空间。

ART的运行时堆,比DVM多了两个Space,分别是Image Space和 Large Object Space。Image Space用来存放一些预加载类,

 Large Object Space用来分配一些大对象。

1.引起GC的原因比DVM要多一些:

1.Concurrent:并发GC,在后台运行,不对APP和内存分配产生影响。

2.Alloc:当内存已满,APP还试图分配内存。

3.Explicit:显式请求垃圾收集,比如调用System.gc()。一般不建议这样做。

4.NativeAlloc:Native比如为Bitmap或者RenderScript分配对象,造成Native内存压力,引发GC。

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

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

7.DisableMovingGc:不是触发GC的真正原因,而是使用了GetPrimitiveArrayCritical,收集会被阻塞,一般不建议使用。

8.HeapTrim:不是触发GC的原因,但是注意收集会一直被阻塞,直到堆内存整理完毕。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值