JVM的垃圾回收可以分为哪些类型?

1 个回答

  • 月关
    杯中之物从来不能消愁补过
    # 作用 在 HotSpot JVM 中,垃圾回收器并不是单一实现,而是提供多种类型,以适应不同的硬件资源和应用性能需求。常见类型包括: - **Serial Garbage Collector(串行回收器)** - 使用单线程执行垃圾回收。 - 资源占用较低,但停顿时间相对较长。 - 适合单核处理器或资源受限的环境。 - **Parallel Garbage Collector(并行回收器)** - 与串行回收器类似,但可以使用多个线程执行垃圾回收工作。 - 更关注吞吐量,适合多核环境。 - **CMS(Concurrent Mark Sweep)回收器** - 通过在应用程序运行时并发执行部分垃圾回收工作,降低回收停顿时间。 - 在 JDK 9 中被废弃,在 JDK 14 中被移除。 - **G1(Garbage First)回收器** - 用于改进并替代 CMS。 - 从 JDK 9 开始成为默认垃圾回收器。 - 适合具有较大内存和多处理器的机器。 - **ZGC** - 面向超低延迟场景的垃圾回收器。 - 可扩展到数 TB 级别的堆内存。 - 在 JDK 11 中作为实验性功能引入,在 JDK 15 中可用于生产环境。 # 原理 大多数 JVM 垃圾回收器采用**分代垃圾回收(Generational Garbage Collection)**,其依据是“弱分代假说”:大多数对象的生命周期都很短。 堆内存通常按对象年龄划分为以下区域: - **Young Space(年轻代)** - 存放新创建的对象,会被频繁回收。 - 又可分为 Eden Space 和 Survivor Spaces。 - **Eden Space(伊甸区)** - 对象最初分配时存放的区域。 - **Survivor Spaces(幸存者区)** - 存放经过一次或多次垃圾回收后仍然存活的对象。 - 通常有多个幸存者区,通过在区域之间复制存活对象来提升回收效率。 - **Old Region(老年代)** - 存放经过多次垃圾回收后仍然存活、年龄足够大的对象。 - 老年代的扫描频率通常低于年轻代。 - **Permanent/Metaspace Region(永久代/元空间)** - 主要存放 JVM 元数据、核心系统类等通常与 JVM 生命周期接近的数据。 垃圾回收的基本过程通常包括: - **标记(Mark)**:识别哪些对象仍然可达、哪些对象可以回收。 - **清除(Sweep)**:清理不可达对象,释放内存。 - **压缩(Compaction)**:整理存活对象,减少内存碎片;具体是否执行以及如何执行取决于具体回收器实现。
    发布于 2026-10-27 22:44 •IP属地 天津
    举报
    评论
    收藏