在 Java 中,垃圾回收(Garbage Collection,GC)是自动进行的内存管理过程,用于回收不再被程序使用的内存对象,从而释放内存并避免内存泄漏。Java 虚拟机(JVM)中提供了不同的垃圾回收方法,主要有以下几种:
- 标记-清除算法(Mark-and-Sweep):这是最基本的垃圾回收算法。它通过标记所有可达对象,然后清除未标记的对象来回收内存。但是它可能导致内存碎片化,影响后续对象的分配。
- 复制算法(Copying):将可用内存划分为两个区域,一次只使用其中一个区域。在进行垃圾回收时,将存活的对象复制到未使用的区域中,然后清除已使用区域的所有对象。这样可以避免内存碎片,但需要维护两个区域。
- 标记-整理算法(Mark-and-Compact):类似于标记-清除算法,但在标记阶段之后,它会将存活的对象移动到内存的一端,然后直接清理边界外的所有对象,从而消除内存碎片。
- 分代收集算法(Generational Garbage Collection):将堆内存分为不同的代,通常是新生代和老年代。新创建的对象被分配在新生代,经过几次垃圾回收后,如果对象仍然存活,则会被移动到老年代。分代收集算法根据对象的生命周期特征采用不同的垃圾回收策略,如新生代使用复制算法,老年代使用标记-整理算法。
- 并发标记-清除算法(Concurrent Mark and Sweep):在标记和清除阶段之间允许应用程序线程和垃圾回收线程并发工作。这样可以减少垃圾回收造成的应用程序停顿时间,提高系统的响应性能。
- G1(Garbage-First)收集器:G1 收集器是 Java 7 引入的一种垃圾回收器。它采用分代收集算法,但不同于传统的分代回收器,G1 将堆内存划分为多个区域,每个区域可以是 Eden 区、幸存者区或老年代。G1 收集器通过在最需要回收内存的区域优先执行垃圾回收,从而减少全局停顿时间。
不同的垃圾回收方法适用于不同的应用场景和需求,Java 虚拟机根据运行时的情况选择合适的垃圾回收器。你可以通过在 Java 命令行参数中设置不同的垃圾回收器来指定使用特定的垃圾回收算法。例如,通过参数-XX:+UseSerialGC使用串行垃圾回收器,-XX:+UseParallelGC使用并行垃圾回收器,-XX:+UseConcMarkSweepGC使用并发标记-清除垃圾回收器,等等。