Java虚拟机(JVM)中的垃圾回收算法主要有以下几种:
标记-清除算法(Mark-Sweep):这种算法会先标记所有活动对象,然后清除所有未标记的对象。这种方法的主要问题是会产生大量的内存碎片,且需要暂停整个应用进行垃圾回收。
复制算法(Copying):这种算法把内存空间分为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。这种方法的优点是简单高效,没有内存碎片,但是需要额外的内存空间。
标记-整理算法(Mark-Compact):这种算法是标记-清除算法的改进版,它在标记了所有需要被清除的对象后,不仅清除对象,还会将所有存活的对象向一端移动,然后直接清理掉边界以外的内存。这种方法的优点是避免了内存碎片,但是移动对象的代价较高。
分代收集算法(Generational Collection):这种算法基于这样一个事实,即不同的对象的生命周期不同。一般将Java堆分为新生代和老年代,这样我们可以根据各个年代的特点选择合适的垃圾回收算法。例如,新生代中对象存活率低,适合采用复制算法;老年代中对象存活率高、无法对其进行整理或复制,适合采用标记-清除或者标记-整理算法。
以上就是JVM中的主要垃圾回收算法,它们各有优缺点,实际应用中往往会结合使用多种算法。