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

Android培训班(79)Dalvik虚拟机的垃圾回收1

2011-11-06 13:20 204 查看
垃圾回收技术已经出现很久了,可以追溯到20世纪60年代,在LISP语言中就开始进行应用,而后的Smalltalk,java,c#等语言更是一步一步地将其推向新的高潮。它广受技术专家的推崇,并被高度的评价,被认为是提高软件质量和生产力的一个有效的银弹,是一个具有革命性技术。由于计算机的内存资源总是有限的,为了不同的程序运行,必须把不需要使用的内存回收,以便重新使用。假如那一天计算机的内存足够大,可以一年内创建的对象,所占用的内存都卓卓有余时,就没有必要使用这种回收技术了。在C++/C的世界里,没有回收技术,其实就是需要开发人员自己负责把它使用完成的内存,主动去删除它。在Dalvik虚拟机实现里,虽然它跟java虚拟机有本质上的区别,但在内存回收这一块,是没有区别的,可能使用垃圾回收的技术,就是一样的。因此,需要先学习计算领域里典型的垃圾回收算法。

在垃圾回收技术里,经典的算法主要有以下三种:引用计数、MarkSweep算法、SemiSpaceCopy算法。其它算法或者混合以上三种法来使用,根据不同的场合来选择不同的算法。

一、引用计数

这种技术非常简单,就是使用一个变量记录这块内存或者对象的使用次数。比如在COM技术里,就是使用引用计数来确认这个COM对象什么时候删除的。当一个COM对象给不同线程来使用时,由于不同的线程生命周期不一样,因此,没有办法知道这个COM对象到底在那个线程删除,只能使用引用计数来删除,否则还需要不同线程之间添加同步机制,这样是非常麻烦和复杂的,如果COM对象有很多,就变成基本上不能实现了。引用计数的优点是:在对象变成垃圾时,可以马上进行回收,回收效率和成本都是最低。因此,内存使用率最高,基本上没有时间花费,不需要把所有访问COM对象线程都停下来。缺点是:引用计数会影响执行效率,每引用一次都需要更新引用计数,对于COM对象那是人工控制的,因此次数很少,没有什么影响。但在Java里是由编译程序来控制的,因此引用次数非常多。另外一个问题就是引用计数不能解决交叉引用,或者环形引用的问题。比如在一个环形链表里,每一个元素都引用前面的元素,这样首尾相连的链表,当所有元素都变成不需要时,就没有办法识别出来,并进行内存回收。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: