Dalvik 虚拟机
- Android4.4版本以前是Dalvik虚拟机
- Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。
- Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
- 不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex
- dex文件格式可以减少整体文件尺寸,提高I/o操作的类查找速度。
- dex文件格式可以减少整体文件尺寸,提高I/o操作的类查找速度。
- odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化。
- 有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。
- 多个类被包含在一个.dex文件中
- GC的过程:这个回收动作和应用程序非并发
- 所有线程就会挂起
- gc对符合条件的对象进行标记;
- gc对标记的对象进行回收;
- 恢复所有线程的执行现场继续运行。
- dalvik这么做的好处是,当pause了之后,GC势必是相当快速的。但是如果出现GC频繁并且内存吃紧势必会导致UI卡顿、掉帧、操作不流畅等。
ART 虚拟机
- 4.4版本开始引入ART虚拟机(Android Runtime)。在4.4版本上,两种运行时环境共存,可以相互切换,但是在5.0版本以后,Dalvik虚拟机则被彻底的丢弃,全部采用ART
- ART GC过程:
- GC将会锁住Java堆,扫描并进行标记;
- 标记完毕释放掉Java堆的锁,并且挂起所有线程;
- GC对标记的对象进行回收;
- 恢复所有线程的执行现场继续运行;
- 相对于dalvik的优势:主要的改善点在将其非并发过程改成了部分并发,还有就是对内存的重新分配管理。
- 它将Java分了一块空间命名为Large-Object-Space,这块内存空间的引入用来专门存放large object。同时ART又引入了moving collector的技术,即将不连续的物理内存块进行对齐。对齐了后内存碎片化就得到了很好的解决。Large-Object-Space的引入是因为moving collector对大块内存的位移时间成本太高
网友评论