minorGC、majorGC、fullGC的区别
在 Java 虚拟机 (JVM) 中,垃圾回收 (Garbage Collection, GC) 是一个自动管理内存的重要机制,它负责回收不再使用的对象所占用的内存。在 JVM 的不同代(Generation)中,垃圾回收有不同的类型,主要包括 Minor GC、Major GC 和 Full GC。
Minor GC (Young Generation GC)
- 作用区域:Minor GC 主要在 JVM 的年轻代(Young Generation)中进行,年轻代又细分为 Eden 区和两个 Survivor 区(S0 和 S1)。
- 触发条件:当 Eden 区的空间被填满时,会触发 Minor GC。Survivor 区的满并不会直接触发 Minor GC。
- 行为:在 Minor GC 过程中,Eden 区和 Survivor 区中的对象会被扫描,不再被引用的对象会被清除。存活的对象会被复制到另一个 Survivor 区,或者如果对象存活时间足够长,会被移动到老年代(Old Generation)。
- 影响:Minor GC 相对频繁,但由于年轻代的对象生命周期往往较短,所以 Minor GC 的执行时间相对较短。
Major GC (Old Generation GC)
- 作用区域:Major GC 主要发生在老年代(Old Generation)中。
- 触发条件:当老年代的空间不足时,会触发 Major GC。此外,如果 Minor GC 后,从年轻代晋升到老年代的对象导致老年代空间不足,也会触发 Major GC。
- 行为:Major GC 会清理老年代中的对象,不再被引用的对象会被回收。如果启用了 CMS 或 G1 等垃圾回收器,可能会只清理老年代,但默认情况下,Major GC 往往会伴随 Full GC。
- 影响:Major GC 的执行时间可能比 Minor GC 长得多,因为它涉及的对象更多,而且对象的生命周期更长,可能需要更多的计算来判断哪些对象可以被回收。
Full GC
- 作用区域:Full GC 清理整个堆内存(Heap),包括年轻代、老年代以及永久代(Permanent Generation,已被 Metaspace 替换)或元空间(Metaspace)。
- 触发条件:
- 调用
System.gc()
方法时,JVM 会建议执行 Full GC,但不一定执行。 - 当老年代空间不足时,如果没有足够的空间来存放 Minor GC 后晋升的对象。
- 当方法区(Method Area)或 Metaspace 空间不足时。
- 通过 Minor GC 后进入老年代的平均对象大小大于老年代的可用内存。
- 调用
- 行为:Full GC 清理整个堆内存和方法区/元空间,回收不再被引用的对象。
- 影响:Full GC 的执行时间最长,因为它涉及的内存区域最广,对应用的性能影响最大。因此,优化 Full GC 的频率和执行时间是 JVM 性能调优的重点之一。
收藏文章数量从多到少与“把书读薄”是一个道理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通