3.Java 垃圾回收机制

  • 一、垃圾回收的基本概念

    • JVM 的垃圾回收器(Garbage Collector, GC )是 Java 内存管理的核心组件,负责 自动回收不再使用的对象,释放内存空间 。垃圾回收器的设计和实现直接影响 Java 应用的性能、吞吐量和延迟。
    • 1. 什么是垃圾回收?
      • 垃圾回收是指JVM自动管理内存的过程, 识别并回收不再使用的对象 ,释放内存空间。
      • 垃圾回收的主要目标是:
        • 提高内存利用率。
        • 减少内存泄漏。
        • 降低开发人员的内存管理负担。
    • 2. 垃圾回收的对象
      • 垃圾回收主要针对 堆内存 中的对象。
      • 栈内存和方法区的内存由 JVM 自动管理,不涉及垃圾回收。
    • 3. 垃圾回收的触发条件
      • 新生代空间不足 :触发 Minor GC。
      • 老年代空间不足 :触发 Full GC。
      • 手动调用 :通过 System.gc() 建议 JVM 执行垃圾回收(不保证立即执行)。
    • 4.Minor GC 及 Full GC
      • Minor GC 的回收过程
        • 复制算法:
        • (1)标记 :标记Eden区和Survivor From区中的存活对象。
        • (2)复制 :将存活对象复制到Survivor To区。
        • (3)清理 :清空Eden区和Survivor From区。
        • (4)晋升 :将满足条件的对象移动到老年代(多次 Minor GC 后仍然存活(默认经过15次))。
      • Full GC 的回收过程
        • (1)标记-清除算法
        • (2)标记-整理算法
        • (3)方法区回收
          • 回收不再使用的类信息、常量池等。如果使用的是元空间(Metaspace),则会释放未使用的元空间内存。
        • Full GC 是垃圾回收中最全面的回收过程,它会清理整个堆内存(包括年轻代、老年代)以及方法区(元空间或永久代)。但是效率较低,从调优角度看要减少使用Full GC。
  • 二、垃圾回收算法

    • 1. 标记-清除算法(Mark-Sweep)
      • 过程
        • (1)标记:从根对象(如栈、静态变量)出发,标记所有可达存活对象。
        • (2)清除:回收未被标记的垃圾对象。
      • 优点
        • 简单易实现。
      • 缺点
        • 产生内存碎片。
        • 效率较低。
    • 2. 复制算法(Copying)
      • 过程
        • (1)将内存分为两块(From 和 To)。
        • (2)将存活对象从 From 复制到 To。
        • (3)清空 From 区域。
      • 优点
        • 无内存碎片。
        • 效率高。
      • 缺点
        • 内存利用率低(只能使用一半内存)。
    • 3. 标记-整理算法(Mark-Compact)
      • 过程
        • (1)标记:标记所有可达对象。
        • (2)整理:将存活对象向一端移动,清理边界外的内存。
      • 优点
        • 无内存碎片。
      • 缺点
        • 效率较低。
    • 4. 分代收集算法(Generational Collection)
      • 思想
        • (1)根据对象的生命周期将堆内存分为新生代(Young Generation)和老年代(Old Generation)。
        • (2) 新生代 使用 复制算法 老年代 使用 标记-清除 标记-整理算法
      • 优点
        • 针对不同区域采用不同算法,提高效率。
  • 三、JVM 堆内存的分代模型

    • JVM 将堆内存分为以下几个区域:
    • 1. 新生代(Young Generation)
      • 特点
        • 存放新创建的对象。
        • 对象生命周期较短。
      • 区域划分
        • (伊甸园)Eden 区 :新对象首先分配在 Eden 区。
        • (幸存者)Survivor 区 :分为 From 和 To 两个区域,To区存放经过 Minor GC 后存活的对象。Survivor From区和Survivor To区的角色会在每次GC后互换。
      • 垃圾回收
        • 使用 复制算法
        • 触发 Minor GC
    • 2. 老年代(Old Generation)
      • 特点
        • 存放长期存活的对象。
        • 对象生命周期较长。
      • 垃圾回收
        • 使用 标记-清除 标记-整理 算法。
        • 触发 Full GC
    • 3. 元空间(Metaspace)
      • 特点
        • 存放类的元数据(如类信息、方法信息等)。
        • JDK 8 之前称为永久代(PermGen)。
      • 垃圾回收
        • 类的卸载由 Full GC 触发。
  • 四、JVM 垃圾回收器

    • 1. Serial GC
      • 特点
        • 单线程垃圾回收器。
        • 适用于单核 CPU 或小型应用。
      • 使用场景
        • 客户端应用或嵌入式系统。
      • 参数
        • **-XX:+UseSerialGC**
          • -XX:表示这是一个 JVM 的扩展参数(非标准参数)
    • 2. Parallel GC(吞吐量优先)
      • 特点
        • 多线程垃圾回收器。
        • 注重吞吐量(Throughput)。
      • 使用场景
        • 后台处理任务或批处理系统。
      • 参数
        • **-XX:+UseParallelGC**
    • 3. CMS GC(Concurrent Mark Sweep)
      • 特点
        • 并发垃圾回收器。
        • 注重低延迟(Low Latency)。
      • 使用场景
        • Web 应用或实时系统。
      • 缺点
        • 内存碎片问题。
      • 参数
        • **-XX:+UseConcMarkSweepGC**
    • 4. G1 GC(Garbage First)
      • 特点
        • 面向服务端应用的垃圾回收器。
        • 将堆内存划分为多个区域(Region),优先回收垃圾最多的区域。
        • 兼顾吞吐量和低延迟。
      • 使用场景
        • 大内存、多核 CPU 的应用。
      • 参数
        • **-XX:+UseG1GC**
    • 5. ZGC(Z Garbage Collector)
      • 特点
        • 低延迟垃圾回收器。
        • 支持 TB 级堆内存。
        • 停顿时间不超过 10ms。
      • 使用场景
        • 对延迟敏感的大型应用。
      • 参数
        • **-XX:+UseZGC**
    • 6. Shenandoah GC
      • 特点
        • 低延迟垃圾回收器。
        • 与 ZGC 类似,但实现方式不同。
      • 使用场景
        • 对延迟敏感的应用。
      • 参数
        • **-XX:+UseShenandoahGC**
  • 五、垃圾回收器的选择

    • 选择合适的垃圾回收器需要根据应用的需求和硬件环境:
      • 在这里插入图片描述
  • 六、垃圾回收器的调优

    • 1. 堆内存调优
      • 参数
        • **-Xms** :初始堆大小。
        • **-Xmx** :最大堆大小。
      • 建议
        • 将 -Xms 和 -Xmx 设置为相同值,避免堆内存动态扩展。
    • 2. 新生代调优
      • 参数
        • **-Xmn** :新生代大小。
      • 建议
        • 新生代大小通常为堆内存的 1/3 到 1/4。
    • 3. 垃圾回收器参数
      • G1 GC
        • **-XX:MaxGCPauseMillis** :设置最大停顿时间。
        • **-XX:G1HeapRegionSize** :设置区域大小。
      • ZGC
        • **-XX:ZAllocationSpikeTolerance** :调整分配尖峰容忍度。
  • 七、垃圾回收器的监控与诊断

    • 1. 监控工具
      • jstat
        • 监控垃圾回收统计信息。
        • 示例: jstat -gc <pid> 1000
      • VisualVM
        • 图形化监控工具,支持垃圾回收分析。
      • GC Log
        • 启用 GC 日志,记录垃圾回收的详细信息。
        • 参数: -Xloggc:<file> -XX:+PrintGCDetails -XX:+PrintGCDateStamps
    • 2. 诊断工具
      • jmap
        • 生成堆转储文件(Heap Dump)。
        • 示例: jmap -dump:format=b,file=heap.bin <pid>
      • Eclipse MAT
        • 分析堆转储文件,查找内存泄漏。

更多推荐