Java中常见的垃圾回收(Garbage Collection,GC)算法有以下几种:
标记-清除算法(Mark and Sweep):
这是最基本的垃圾回收算法之一。它分为两个阶段:标记和清除。
- 标记阶段:从根节点(一般是活动对象的引用)开始,标记所有可达对象,标记所有不可达对象为待清理状态。
- 清除阶段:清除所有被标记为不可达的对象,释放它们所占用的内存空间。
缺点是清除过程中会产生内存碎片。
复制算法(Copying):
这种算法主要用于新生代的垃圾回收。它将内存区域分为两块,每次只使用其中一块,当这块内存区域满了之后,将存活的对象复制到另一块空闲区域中。
优点是避免了内存碎片化,但也存在内存空间利用率较低的问题,因为只能使用一半的内存空间。
标记-整理算法(Mark and Compact):
这种算法也适用于老年代的垃圾回收。首先,与标记-清除算法类似,标记出所有活动对象。接着,将存活的对象向一端移动,然后清理掉边界以外的所有对象。
优点在于整理内存空间,避免了内存碎片化,但也会引起内存移动的开销。
分代算法(Generational):
分代算法根据对象的存活周期将内存分为不同的代(Generation)。一般分为新生代(Young Generation)和老年代(Old Generation)。
- 新生代:通常采用复制算法,因为新生代对象的生命周期较短,适合这种方式。
- 老年代:一般采用标记-整理算法,因为老年代的对象生命周期较长,而且老年代中的对象之间引用关系较为复杂。
增量式回收算法(Incremental Garbage Collection):
这种算法将整个垃圾回收过程分成多个小步骤来执行,每执行一个小步骤后让应用程序继续运行一会儿,然后再执行下一个小步骤。
目的是减少单次垃圾回收导致的长时间停顿,提高系统的响应性。