JVM垃圾回收机制介绍

125 阅读2分钟

JVM垃圾回收机制介绍

Java虚拟机(JVM)的垃圾回收(GC)机制是Java内存管理的核心部分,它自动回收不再使用的对象占用的内存空间。以下是JVM垃圾回收机制的主要要点:

基本原理

  1. 自动内存管理​:开发者无需手动释放内存,由JVM自动完成
  2. 可达性分析​:通过GC Roots(如栈帧中的局部变量、静态变量等)作为起点,标记所有可达对象
  3. 分代收集​:根据对象生命周期将堆内存划分为不同区域

内存分代

JVM堆内存通常分为以下几代:

  1. 新生代(Young Generation)​

    • Eden区:新创建的对象首先分配在这里
    • Survivor区(From/To):存放经过Minor GC后存活的对象
    • 采用"复制算法"进行回收
  2. 老年代(Old Generation)​

    • 存放长期存活的对象
    • 采用"标记-清除"或"标记-整理"算法
  3. 永久代/元空间(PermGen/Metaspace)​

    • 存放类元数据等信息(Java 8后改为Metaspace)

垃圾回收算法

  1. 标记-清除(Mark-Sweep)​

    • 标记所有需要回收的对象
    • 统一清除被标记对象
    • 会产生内存碎片
  2. 复制算法(Copying)​

    • 将内存分为两块,每次使用一块
    • 将存活对象复制到另一块
    • 适用于对象存活率低的场景(如新生代)
  3. 标记-整理(Mark-Compact)​

    • 标记存活对象
    • 将存活对象向一端移动
    • 清理边界外的内存
    • 避免内存碎片
  4. 分代收集(Generational Collection)​

    • 结合多种算法,针对不同代使用最适合的算法

垃圾回收器类型

  1. Serial收集器​:单线程,适合客户端应用
  2. Parallel/Throughput收集器​:多线程,追求高吞吐量
  3. CMS(Concurrent Mark Sweep)收集器​:并发收集,减少停顿时间
  4. G1(Garbage-First)收集器​:面向服务端,可预测停顿时间
  5. ZGC和Shenandoah​:新一代低延迟收集器(Java 11+)

GC触发条件

  1. Minor GC/Young GC​:Eden区满时触发
  2. Major GC/Old GC​:老年代满时触发
  3. Full GC​:整个堆内存(包括方法区)进行回收

性能调优参数

常见JVM GC调优参数:

  • -Xms / -Xmx:初始/最大堆大小
  • -XX:NewRatio:新生代与老年代比例
  • -XX:SurvivorRatio:Eden与Survivor区比例
  • -XX:+UseG1GC:启用G1收集器

JVM的垃圾回收机制通过自动内存管理大大简化了开发工作,但理解其原理对于性能调优和解决内存相关问题至关重要。