- 标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。
- 复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。
- 标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
- 分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。
Java虚拟机(JVM)提供了多种垃圾回收算法,每种算法都具有不同的特点和适用场景。以下是几种常见的垃圾回收算法:
- 标记-清除算法(Mark and Sweep):这是最基本的垃圾回收算法。它分为两个阶段:标记阶段和清除阶段。在标记阶段,垃圾回收器标记出所有仍然被引用的对象。在清除阶段,未被标记的对象将被清除,释放内存空间。
- 复制算法(Copying):复制算法将堆内存分为两个区域,通常是相等大小的两个半区。在垃圾回收过程中,先将存活的对象从一个半区复制到另一个半区,然后清除当前半区中的所有对象。这样,内存空间得以紧凑排列,不会产生内存碎片。
- 标记-压缩算法(Mark and Compact):标记-压缩算法结合了标记阶段和压缩阶段。首先,标记出所有存活的对象,然后将它们向内存的一端移动,最后清除边界之外的内存空间。
- 标记-清除-压缩算法(Mark and Sweep with Compaction):这是一种结合了标记-清除和标记-压缩两个阶段的垃圾回收算法。首先,标记出所有存活的对象。然后,在清除阶段,清除未标记的对象并释放内存空间。最后,将存活的对象压缩到内存的一端,释放出连续的内存空间。
- 分代垃圾回收算法(Generational):分代垃圾回收算法基于一个观察:大部分对象的生命周期很短。根据这一观察,分代算法将堆内存划分为几个不同的代,通常是年轻代(Young Generation)和老年代(Old Generation)。年轻代主要包含新创建的对象,而老年代包含存活时间较长的对象。不同的代使用不同的垃圾回收算法,以更好地适应不同代的特点。
这些垃圾回收算法在不同的场景下具有优劣之处。JVM通常会根据应用程序的特性和运行环境选择合适的垃圾回收算法,以达到更好的性能和内存利用率。此外,Java虚拟机还提供了一些参数和选项,允许开发人员调整垃圾回收器的行为和性能。