jvm---YoungGC和FullGC的触发条件是什么

YoungGC的触发条件

YoungGC的触发条件比较简单,那就是当年轻代中的eden区分配满的时候就会触发。

FullGC的触发条件

FullGC的触发条件比较复杂也比较多,主要以下几种:

  1. 老年代空间不足

    • 创建一个大对象,超过指定阈值会直接保存在老年代当中,如果老年代空间也不足,会触发Full GC。
    • YoungGC之后,发现要移到老年代的对象,老年代存不下的时候,会触发一次FullGC
  2. 空间分配担保失败

    • 当准备要触发一次YoungGC时,会进行空间分配担保,在担保过程中,发现虚拟机会检查老年代最大可用的连续空间小于新生代所有对象的总空间,但是HandlePromotionFailure=false,那么就会触发一次FullGC(HandlePromotionFailure 这个配置,在JDK 7中并不在支持了,这一步骤在该版本已取消)
    • 当准备要触发一次YoungGC时,会进行空间分配担保,在担保过程中,发现虚拟机会检查老年代最大可用的连续空间小于新生代所有对象的总空间,但是HandlePromotionFailure=true,继续检查发现老年代最大可用连续空间小于历次晋升到老年代的对象的平均大小时,会触发一次FullGC
  3. 永久代空间不足

    • 如果有永久代的话,当在永久代分配空间时没有足够空间的时候,会触发FullGC
  4. 代码中执行System.gc()

    • 代码中执行System.gc()的时候,会触发FullGC,但是并不保证一定会立即触发。

空间分配担保失败

空间分配担保机制

如果Survivor区域的空间不够,就要分配给老年代,也就是说,老年代起到了一个兜底的作用。但是,老年代也是可能空间不足的。所以,在这个过程中就需要做一次空间分配担保(CMS)

在每一次执行YoungGC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。

  • 如果大于,那么说明本次Young GC是安全的。

  • 如果小于,那么虚拟机会查看HandlePromotionFailure 参数设置的值判断是否允许担保失败。如果值为true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小(一共有多少对象在内存回收后存活下来是不可预知的,因此只好取之前每次垃圾回收后晋升到老年代的对象大小的平均值作为参考)。如果大于,则尝试进行一次YoungGC,但这次YoungGC依然是有风险的;如果小于,或者HandlePromotionFailure=false,则会直接触发一次Full GC。

但是,需要注意的是HandlePromotionFailure这个参数,在JDK 7中就不再支持了:

在JDK代码中,移除了这个参数的判断,也就是说,在后续的版本中, 只要检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小,如果大于,则认为担保成功。

但是需要注意的是,担保的结果可能成功,也可能失败。所以,在YoungGC的复制阶段执行之后,会发生以下三种情况:

  • 剩余的存活对象大小,小于Survivor区,那就直接进入Survivor区。
  • 剩余的存活对象大小,大于Survivor区,小于老年代可用内存,那就直接去老年代。
  • 剩余的存活对象大小,大于Survivor并且大于老年代,触发"FullGC"。
相关推荐
爱吃烤鸡翅的酸菜鱼3 分钟前
Spring Boot 注解全栈指南:涵盖 Bean 注册、配置加载、请求映射、事务控制、数据校验等一网打尽
java·开发语言·spring boot·后端·spring
running up8 分钟前
Spring IOC与DI核心注解速查表
java·后端·spring
洛阳泰山10 分钟前
快速上手 MaxKB4J:开源企业级 Agentic 工作流系统在 Sealos 上的完整部署指南
java·人工智能·后端
bybitq12 分钟前
string,byte,rune,character?详解Golang编码-UTF-8
开发语言·后端·golang
无限进步_16 分钟前
【C语言】栈(Stack)数据结构的实现与应用
c语言·开发语言·数据结构·c++·后端·visual studio
czlczl2002092524 分钟前
Spring Boot + Redis :如何设计“登出”功能
spring boot·redis·后端
林太白28 分钟前
Rust01-认识安装
开发语言·后端·rust
羑悻的小杀马特41 分钟前
LRU Cache:高频访问数据的“智能保鲜舱”与经典淘汰艺术
c++·后端·lru cache·热点数据与冷数据
JaguarJack1 小时前
再推荐 10 个低调但非常实用的 PHP 包
后端·php
a程序小傲1 小时前
米哈游Java后端面试被问:Spring Boot Starter的制作原理
java·spring boot·后端