您的位置:首页 > 移动开发 > Android开发

Android培训班(81)Dalvik虚拟机的垃圾回收3

2011-11-27 10:33 211 查看
下面就来先看看Dalvik虚拟机整个标记和清除中使用到那些函数,在文件alloc/MarkSweep.h里有函数如下:

1)调用函数dvmHeapBeginMarkStep来创建位图,并从对象位图里拷贝一份位图出来,以便后面对这个位图进行标记。

2)调用函数dvmHeapMarkRootSet对所有根对象进行标记。

3)调用函数dvmHeapScanMarkedObjects根据上一个函数给出的根对象位图,对每一个根相关的位图进行计算,如果这个根对象有被引用,就标记为使用。这个过程是递归调用的过程,从根开始不断重复地对子树进行标记的过程。

4)调用函数dvmHeapHandleReferences对JAVA类对象的引用类型进行处理。主要处理三个直接的了类:SoftReference,WeakReference,PhantomReference。SoftReference对象封装了对引用目标的“软引用”;WeakReference封装了对引用目标的“弱引用”;而PhantomReference封装了对引用目标的“影子引用。强引用禁止引用目标被垃圾收集,而软引用、弱引用和影子引用不禁止。

5)调用函数dvmHeapScheduleFinalizations对未曾标记的对象进行完成调用,让每一个对象最后删除动作可以运行,以便后面从内存里把对象删除,相当于对象的析构作用。

6)调用函数dvmHeapSweepUnmarkedObjects对未曾标记的对象进行清除操作,也就是删除没有再使用的对象。

7)调用函数dvmHeapFinishMarkStep对已经删除的对象进行内存回收,可以调用堆管理函数改变目前堆使用的内存,并整理内存,就可以得到更多空闲的内存了。

这个过程,就是Dalvik虚拟机的整个标记和删除的算法过程,实际的代码会相当复杂,算法上是很清楚的,就是细节、时间方面要求相当严格,否则乱删除还在使用的对象,就导致整个虚拟机运行出错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: