累!粗略学习 Minor GC 和 Full GC

Minor GC 和 Full GC

20250423

Minor GC

Minor GC 主要用于清理年轻代的垃圾,触发频繁但停顿时间短,对性能影响较小

这个主要是对新生代进行GC,它采用 复制算法

  • 作用范围:仅针对 年轻代(Young Generation),包括 Eden 区和两个 Survivor 区(S0 和 S1)。

  • 目标:清理年轻代中的垃圾对象,将存活对象复制到 Survivor 区或晋升到老年代

  • 触发条件:当 Eden 区的内存被填满 时,会触发 Minor GC。

  • 触发频率:通常比较频繁,因为年轻代的对象生命周期较短,内存很快会被填满

  • 效率:通常比较快,因为年轻代的内存空间相对较小,且对象生命周期较短,垃圾较多。

  • 停顿时间:停顿时间较短,对应用程序性能的影响相对较小

  • 停顿:每次触发时会暂停应用程序的线程(Stop-The-World),但停顿时间较短,通常对用户体验影响较小。

  • 性能:频繁的 Minor GC 可以及时清理年轻代的垃圾,减少 Full GC 的触发频率,从而优化整体性能。

  • 常用算法:通常使用 复制算法(Copying Algorithm),将存活对象从一个区域复制到另一个区域。

  • 优势:复制算法简单高效,适合对象生命周期较短的年轻代

  • 新生代内存

    eden、 servicorFrom 复制到 ServicorTo,年龄+1
    首先,把 Eden 和 ServivorFrom 区域中存活的对象复制到 ServicorTo 区域(如果有对象的年龄以
    及达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1(如果 ServicorTo 不够位
    置了就放到老年区);
    2. 清空 eden、 servicorFrom
    然后,清空 Eden 和 ServicorFrom 中的对象;
    3. ServicorTo 和 ServicorFrom 互换
    最后, ServicorTo 和 ServicorFrom 互换,原 ServicorTo 成为下一次 GC 时的 ServicorFrom区

Full GC

Full GC 是对整个堆内存的全面清理,触发频率低但停顿时间长,对性能影响较大

ull GC(Full Garbage Collection,全量垃圾回收) 是 JVM 垃圾回收机制中最彻底、最耗时的回收过程。它会清理整个堆内存(包括年轻代和老年代)以及元空间(部分 GC 算法可能不回收元空间),并整理内存碎片

这个是是对老年代全局 GC,它使用标记-清除算法(Mark-Sweep Algorithm)或 标记-压缩算法

  • 作用范围:清理整个 JVM 堆内存,包括 年轻代老年代(Old Generation)和 永久代(Permanent Generation,或元空间 Metaspace,取决于 JVM 的版本),Full GC 会清理整个堆内存(包括年轻代和老年代)以及元空间。。

  • 回收对象:清理所有不再被引用的对象(即“垃圾”),并整理内存碎片

  • 目标:彻底清理整个堆内存中的垃圾对象,回收所有无用对象占用的空间。

  • 触发条件

    • 触发条件说明
      老年代空间不足当对象从年轻代晋升到老年代时,若老年代剩余空间不足,无法容纳新晋升对象。
      元空间(Metaspace)不足类元数据(如加载的类信息)占满元空间。
      显式调用 System.gc()代码中主动调用垃圾回收,但实际是否执行由 JVM 决定。
      堆外内存(Direct Memory)不足使用 NIO 分配的堆外内存超出限制。
      垃圾回收器失败例如 CMS 收集器在并发标记阶段出现“Concurrent Mode Failure”时,会触发 Full GC。

      老年代的内存不足,无法容纳晋升的对象。

    • 永久代(或元空间)的内存不足。

    • 手动调用 System.gc()(不推荐,因为这会强制触发 Full GC)。

    • 其他特定的 JVM 参数或配置导致的触发。

  • 触发频率:相对较少,因为老年代和永久代的内存占用通常比较稳定

  • 效率:通常比较慢,因为需要清理整个堆内存,包括老年代和永久代,这些区域的对象生命周期较长,垃圾回收的复杂度更高。

  • 停顿时间:停顿时间较长,对应用程序性能的影响较大,可能导致明显的卡顿。

  • 停顿:每次触发时也会暂停应用程序的线程,但停顿时间较长,可能导致明显的卡顿,对用户体验影响较大。

  • 性能:虽然 Full GC 可以彻底清理内存,但如果触发过于频繁,会显著降低应用程序的性能

  • 常用算法:通常使用 标记-清除算法(Mark-Sweep Algorithm)或 标记-压缩算法(Mark-Compact Algorithm)。

  • 优势:这些算法适合处理对象生命周期较长的老年代和永久代,可以彻底清理内存并整理内存碎片。

调优建议

  • Minor GC

    • 调整年轻代大小:通过 -Xmn 参数调整年轻代的大小,避免 Eden 区频繁填满。

    • 调整 Survivor 区比例:通过 -XX:SurvivorRatio 参数调整 Survivor 区的大小,优化对象的复制过程。

  • Full GC

    • 调整老年代大小:通过 -Xms-Xmx 参数调整堆内存大小,确保老年代有足够的空间。

    • 优化垃圾回收器:选择合适的垃圾回收器(如 G1、CMS、ZGC 等),根据应用程序的特点进行优化。

五、Full GC 的优化实践
  1. JVM 参数调优

    • 启用 G1 垃圾回收器(-XX:+UseG1GC),适用于低延迟、高吞吐的场景。

    • 设置目标最大 GC 暂停时间(-XX:MaxGCPauseMillis=200)。

    • 设置老年代占用一定比例时触发并发标记(-XX:InitiatingHeapOccupancyPercent=45),避免 Full GC。

  2. 监控与告警

    • 使用 jstat -gcutil <PID> 1000 实时监控 GC 状态。

    • 关注老年代内存占用率(O 列),若持续高于阈值需优化。

    • 关注 Full GC 次数(FGC)与总耗时(FGCT),减少 Full GC 的频率和耗时。

六、排查 Full GC 问题
  1. 导出堆转储(Heap Dump)

    • 使用命令 jmap -dump:format=b,file=full_gc_dump.hprof <PID> 在 Full GC 发生时自动导出 Heap Dump。

  2. 使用 MAT 内存工具分析

    • 打开 Heap Dump 文件,分析支配树(Dominator Tree),查看哪些对象占用了最多内存。

    • 查看 GC Roots 引用链,确认对象是否被强引用持有,导致无法回收

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值