在Java里,垃圾回收(Garbage Collection,GC)算法的作用是自动识别并回收不再使用的对象,从而释放内存。下面为你介绍常见的垃圾回收算法及其优缺点:

标记 - 清除算法(Mark - Sweep)

  • 原理:此算法分两个阶段。首先,标记出所有需要回收的对象;接着,清除这些被标记的对象。
  • 优点:实现简单,无需额外的内存空间。
  • 缺点:会产生大量的内存碎片。随着时间推移,这些碎片会导致无法分配大对象,进而频繁触发垃圾回收。

标记 - 整理算法(Mark - Compact)

  • 原理:同样先标记出需要回收的对象,之后把存活的对象向内存的一端移动,最后清理掉边界以外的内存。
  • 优点:解决了标记 - 清除算法产生内存碎片的问题,能更有效地利用内存。
  • 缺点:需要移动对象,这会增加处理的时间开销,效率相对较低。

复制算法(Copying)

  • 原理:把内存划分为大小相等的两块,每次只使用其中一块。当这块内存用完后,就将还存活的对象复制到另一块上面,然后把已使用过的内存空间一次性清理掉。
  • 优点:实现简单,回收效率高,不会产生内存碎片。
  • 缺点:内存利用率较低,因为只能使用一半的内存空间。

分代收集算法(Generational Collection)

  • 原理:依据对象的存活周期将内存划分为不同的区域,一般是新生代和老年代。新生代中对象的存活时间短,使用复制算法;老年代中对象的存活时间长,采用标记 - 清除或标记 - 整理算法。
  • 优点:结合了不同算法的优点,根据对象的特点采用合适的算法,提高了垃圾回收的效率。
  • 缺点:实现较为复杂,需要对不同代的对象进行管理和监控。

这些垃圾回收算法各有优劣,Java虚拟机(JVM)会根据不同的场景和需求选择合适的算法来实现垃圾回收。