题目:YoungGC和FullGC的触发条件是什么?
难度:low
标签:jvm/gc, general/knowledge, difficulty/low
评分:⭐⭐⭐☆☆(3/5)
ygc的触发条件是年轻代空间达到满溢比例,然后开始进行年轻代中eden区和s1区的回收;
fgc触发条件就相对较多了,老年代空间使用到一定比例应该是80%会触发fgc进行老年代回收,这里不同的垃圾回收器有不同的处理比如G1就引入了mgc,提前会做一次老年代部分空间的回收,而不是直接触发fgc;
另外方法区出现空间不足也会引起fgc进行垃圾回收;
优点:
不足:
补充:完整 FGC 触发条件有 6 种,避免策略有 3 种。
核心考点定位:考察对 YoungGC 和 FullGC 触发机制的完整理解,以及 FGC 的避免策略。
知识点拆解:
考察方向:
延伸递进面试题:
【一句话结论】
面试官您好,YoungGC 是 Eden 满触发,FullGC 有 6 种触发条件,核心是老年代空间不足或 Metaspace 不足。
【三点展开】
第一,YoungGC 最常见,Eden 区满就触发,回收新生代,存活对象复制到 Survivor。频率高但速度快,通常 10-100ms。
第二,FullGC 有 6 种触发条件:老年代空间不足(对象晋升或大对象直接分配)、Survivor 空间不足(空间分配担保失败)、Metaspace 不足、System.gc() 显式调用、-XX:+ExplicitGCInvokesConcurrent 触发并发 Full GC、G1 的 Mixed GC 跟不上回收速度退化到 Full GC。其中老年代空间不足是最常见的。
第三,FGC 的避免策略有 3 种:增大老年代空间、调整晋升阈值(MaxTenuringThreshold)让对象更早晋升或更晚晋升、用 G1 的 Mixed GC 替代 Full GC(Mixed GC 是 Young GC + 部分老年代 Region,可预测停顿)。另外要排查内存泄漏,避免对象持续增长导致老年代满。
【一句边界】
当然,System.gc() 在 JDK 9+ 默认关闭,生产环境应禁用(-XX:+ExplicitGCInvokesConcurrent 改为 -XX:-ExplicitGCInvokesConcurrent)。FGC 是最后手段,频繁触发说明有内存泄漏或参数配置不当。