标记-清除(Mark-Sweep)
概述:这是最基础的垃圾回收算法。它分为两个阶段:标记阶段和清除阶段。在标记阶段,从根对象开始,标记所有可达的对象;在清除阶段,清除所有未被标记的对象。这个算法的问题是会产生大量不连续的内存碎片,可能会导致“内存碎片化”。
优点:实现简单,容易理解。
缺点:会产生内存碎片,可能导致空间浪费。
复制(Copying)
概述:这个算法将内存分为两个相等的区域,每次只用其中一个区域。当进行垃圾回收时,将当前正在使用的区域中的活动对象复制到另一个区域,然后清除当前区域的所有对象。这个算法可以消除内存碎片化问题,但是需要两倍的内存空间。
优点:可消除内存碎片,空间利用率高。
缺点:需要两倍的内存空间,且只能使用其中一块。
标记-压缩(Mark-Compact)
概述:这个算法是标记-清除算法的一种改进,它在清除阶段将所有存活的对象压缩到一端,这样可以解决内存碎片化问题。但是,这个算法需要额外的空间来存储下次垃圾回收的起始位置。
优点:可消除内存碎片。
缺点:需要额外的空间来记录下次回收的起始位置,且需要移动存活对象,效率较低。
分代收集(Generational)
概述:这个算法将内存分为新生代和老年代,并根据对象的存活周期进行不同的处理。新生代中存放生命周期较短的对象的实例,老年代中存放生命周期较长的对象的实例。这种算法可以针对不同代进行不同的垃圾回收策略,例如对新生代使用复制算法,对老年代使用标记-压缩算法。
优点:针对不同生命周期的对象采用不同的回收策略,可以提高效率。
缺点:实现复杂度较高,需要精确地控制不同代的大小。
引用计数(Reference Counting)
概述:这个算法为每个对象维护一个引用计数,当一个对象被引用时,引用计数加一;当一个对象被释放时,引用计数减一。当引用计数为零时,该对象被认为是可以回收的。但是,这个算法无法处理循环引用问题。
优点:实时性较好,当没有引用时,内存可以直接被释放。
缺点:无法处理循环引用问题,且维护引用计数需要消耗较多资源。
评论