Minor GC、Major GC与Full GC讲解

Minor GC

介绍

  • 年轻代的垃圾回收,该GC会清理伊甸园区和幸存区。
  • 因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。
  • Minor GC会引发STW:暂停其它用户线程,等垃圾回收结束,用户线程才恢复运行。

触发条件

伊甸园区空间不足会触发,幸存区空间不足不会触发,但是触发Minor GC就会清理伊甸园区和幸存。

触发结果

经过一次Minor GC后

  1. 伊甸园区没有被回收的对象被放到to区,并且年龄计数器设置为1。
  2. from区的没有被回收的对象到to区,年龄计数器加一,from和to区交换,此时to为空。

总结:复制之后有交换,谁空谁是to区

Major GC

介绍

  • 对老年代的垃圾回收。
  • Major GC的速度一般会比Minor GC慢10倍以上,STW的时间更长。
  • 如果Major GC后,内存还不足,就报OOM了。

触发条件

老年代空间不足先触发Minor GC,之后空间还不足则触发Major GC( 出现了Major GC,经常会伴随至少一次的Minor GC )

Full GC

介绍

清理整个堆空间,包括年轻代、老年代和元空间(方法区),非常慢。

触发条件

  • 调用System.gc(),系统建议执行Full GC,但不是必然执行。

  • 老年代空间不足。

  • 方法区空间不足。

  • 通过Minor GC后进入老年代的平均大小大于老年代的可用内存。

  • from向to复制的时候,对象大小大于to的内存,则把对象转移到老年代,且老年代的的可用内存小于对象大小。

说明:Full GC是开发中尽量避免的,减少Major GC 和 Full GC的发生就是调优。

对象申请堆区空间流程

  1. 判断伊甸园区是否能放下,如果能放下就放,如果放不下则触发Minor GC。
  2. Minor GC后伊甸园区能放下就放,如果放不下,说明该对象是超大对象直接放到老年代。
  3. Minor GC后,在伊甸园区存活的对象要进入幸存区。
  4. 如果幸存区放不下或者幸存区的对象的年龄计数器大于15,则直接放到老年代。
  5. 如果老年代也放不下,触发Major GC。
  6. Major GC后再次判断是否老年代能放下该对象,如果不够说明堆内存空间不够->OOM。
  7. Minor GC后,在伊甸园区存货的对象要进入幸存区。

总结:垃圾回收频繁发生在新生区,很少发生在养老区,几乎不发生在永久区/元空间

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙域、白泽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值