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的原因,但是注意收集会一直被阻塞,直到堆内存整理完毕。