引用计数法、标签消除法、标签压缩法、复制算法、世代算法等。
1 .参考计数器法:假设有某个对象a。 假设其中一个对象引用了a。 如果对象a的参考计数器1引用失败,则对象a的参考计数器为-1。 如果对象a的参考计数器的值为0,则对象a不被引用,并且可以回收。
优缺点:
优点:
1 .实时性强,不需要等内存用完再开始回收,运行时按对象计数器是否为0进行回收。
2 .在垃圾回收期间,不需要挂起APP应用程序。 申请内存时,如果内存不足,会立即报告outofmember错误。
3 .在地域上,更新对象的计数器只会影响该对象,而不会扫描所有对象。
坏处:
1 .每次引用对象时都需要更新计数器,这需要一点时间。
2 .浪费CPU资源,尽管内存足够,但在运行时进行计数器的合计。
3 .无法解决循环引用问题。 (最大的缺点)
如果a和b两个对象具有交叉引用,则即使a和b均为空,也永远不会回收a和b。
2 .消除标记法
标记:从根节点标记引用的对象
清除:未在标记中参照的对象是垃圾对象,可以进行清理
优点:解决了参考计数器算法中的循环引用问题,从根节点回收未引用的对象
坏处:
1 .效率低下,需要通过标记和清除两种动作遍历所有对象,GC时需要暂停APP,在要求交互性的APP应用中体验非常差。
2 .通过标记清除算法清理的内存碎片严重,回收的对象存在于内存的各个角落,使得清理的内存不一致。
3 .标记压缩算法
优化了标记去除算法,在清理阶段将存活对象压缩到内存边缘,通过清理边界以外的垃圾解决了碎片问题。
优点:解决了碎片问题
缺点:进一步增加了标记压缩算法,对象移动内存位置,对效率有一定的影响。
4 .复制算法
将内存空间分割为2部分,每次使用其中的一部分时,将使用中的对象复制到其他的内存空间,清空该内存,交换内存的作用