论文部分内容阅读
安卓操作系统运行的应用程序不需要开发者手动管理内存,而是使用垃圾收集对内存进行自动回收,在减少应用程序开发者的工作量、避免内存泄漏问题的同时,也因垃圾收集执行时需要暂停所有线程,给系统带来响应迟缓的不良后果,而且当前使用的是比较基础的标记-清除算法,这种算法扫描整个内存区域,造成暂停时间过长,需要予以优化和改进。 本文在分析了垃圾收集的各种基本算法和安卓的运行时环境后,在安卓原有的标记-清除算法基础上,设计并实现了分代垃圾收集来提升性能。分代垃圾收集基于统计规律,认为大部分对象都在年轻时成为垃圾,因此将垃圾收集的工作着重放在对年轻对象的收集上,在满足需求的前提下减少暂停时间。本文首先在安卓的堆资源中增加了分代位图,将所有堆中的对象分为年轻代和老年代,在一次垃圾收集完成后将存活的年轻代对象提升为老年代,然后在下一次垃圾收集开始时将老年代对象全部进行快速标记,在递归标记阶段中就可以集中扫描年轻代对象。为了避免被老年代引用的年轻代对象遭遇误收集的情况,本文建立了分代卡表来记录代间指针。为了在保证高效率的情况下避免内存泄漏,本文在绝大部分垃圾收集情况下使用快速的分代垃圾收集,而在不能满足需求时使用完全的垃圾收集。另外,还对分代垃圾收集中部分操作进行了并行化设计。 使用(0)xBenchmark测试软件,在采用OMAP4460处理器的Pandaboard开发平台上对本文设计的分代垃圾收集进行测试。结果表明:在测试程序整体用时方面,最快用时2491毫秒,平均用时3332毫秒,平均用时缩短了20.83%;在对不同深度二叉树进行不断申请、释放的分项测试中,每一项用时平均缩短25.9%;在对单次垃圾收集所花费的暂停时间的测试中,单次暂停时间平均缩短29.4%;另外在对收集率的测试中,分代垃圾收集未见内存泄露的现象。