垃圾回收机制
首先介绍下dalvik的GC的过程。主要有有四个过程:
当gc被触发时候,其会去查找所有活动的对象,这个时候整个程序与虚拟机内部的所有线程就会挂起,这样目的是在较少的堆栈里找到所引用的对象;
注意:这个回收动作和应用程序非并发;
所有线程就会挂起
gc对符合条件的对象进行标记;
gc对标记的对象进行回收;
恢复所有线程的执行现场继续运行。
dalvik这么做的好处是,当pause了之后,GC势必是相当快速的。但是如果出现GC频繁并且内存吃紧势必会导致UI卡顿、掉帧、操作不流畅等。
后来ART改善了这种GC方式, 主要的改善点在将其非并发过程改成了部分并发,还有就是对内存的重新分配管理。
当ART GC发生时:
GC将会锁住Java堆,扫描并进行标记;
标记完毕释放掉Java堆的锁,并且挂起所有线程;
GC对标记的对象进行回收;
恢复所有线程的执行现场继续运行;
重复2-4直到结束。
可以看出整个过程做到了部分并发使得时间缩短。据官方测试数据说GC效率提高2倍。
提高内存使用,减少碎片化
Dalvik内存管理特点是:内存碎片化严重,当然这也是Mark and Sweep算法带来的弊端。
可以看出每次GC后内存千疮百孔,本来连续分配的内存块变得碎片化严重,之后再分配进入的对象再进行内存寻址变得困难。
ART的解决:在ART中,它将Java分了一块空间命名为Large-Object-Space,这块内存空间的引入用来专门存放large object。同时ART又引入了moving collector的技术,即将不连续的物理内存块进行对齐。对齐了后内存碎片化就得到了很好的解决。Large-Object-Space的引入是因为moving collector对大块内存的位移时间成本太高。根官方统计,ART的内存利用率提高10倍了左右,大大提高了内存的利用率。
网友评论