1.Reference counting(引用计数)
基本思想:为每一个object存储一个计数RC,每当有一个refere指向它时,RC++;当一个reference断开与它的链接的时候,RC--;如果RC == 0,则回收它.
计数回收的优点:
1).实现简单
2).计算代价分散
3).幽灵时间短
计数回收的缺点:
1).不全面,容易漏掉循环引用的对象
2).并发支持较弱
3).占用额外的内存空间
2.Mark-Sweep(标记清除)
思想:为每个对象设置状态位(live/dead)并记录,即mark阶段;将标记为dead的对象进行检测,即sweep阶段
标记清除的优点:
1)全面的:循环的收集垃圾
2)指针操作没有运行时间开销
3)不移动对象
标记清除的缺点:
1)Stop/start 导致暂停以及较长的僵尸时间
2)内存中的每个位置都必须在该算法的扫描阶段进行检查,而这可能非常耗时且复杂度为O(heap)而不是O(live)
3)空间碎片:当对象被清除时,会在使用过的内存中留下几个空白.这种碎片对于需要大量内存的应用程序会造成严重的性能问题。
3.Mark-Compact(标记整理)
思想:对对象进行标记,清理到死掉的对象,将所有活着的对象移动到最后.
标记整理的优点:
1)采用该算法可以解决标记清除产生的空间碎片问题
2)内存中对象的相对顺序保持不变 - 也就是说,如果对象X在GC之前具有比Y更高的内存地址,则它之后仍然具有更高的地址。
这个属性对于像数组这样的特定数据结构很重要。
标记整理的缺点:
它比Mark-Sweep采集需要更多的时间,这会严重影响性能。
4.Fragmentation and Copying(复制)
思想:将空间分成两个部分,分别叫做from和to,每次GC,将所有的活着的对象从from区copy到to区域,之后from变为to,to变为from.
复制GC的优点:
1)GC后数据更加紧凑
2)所有对象的大小分配代价很小
3)空间开销固定
4)全面的:循环的尽心垃圾回收
5)实现简单
复制GC的缺点:
1)stop-and-copy可能造成严重的后果
2)需要的空间更大
3)长时间存活的对象可能被重复的copy
4)所有的引用必须重新更新