【大白话说Java面试题 第44题】【JVM篇】第4题:什么时候会触发 Young GC?什么时候会触发 Full GC?
📌PDF:大白话说Java面试题 — 02-JVM篇
第4题:什么时候会触发 Young GC?什么时候会触发 Full GC
📚回答:
- 一句话概括:
- Young GC:当新生代(Eden 区)内存不足时触发。
- Full GC:当 JVM 整体内存不足(包括老年代或元空间)时触发。
1. Young GC 的触发条件
常见场景:
- 新对象不断被创建,占满 Eden 区后触发 Young GC。
- 如果 Survivor 区无法容纳存活对象,则部分对象会被晋升到老年代。
底层原理:
- Young GC 使用的是复制算法,将 Eden 区和 Survivor 区的存活对象复制到另一个 Survivor 区。如果 Survivor 区空间不足,则直接晋升到老年代。
2. Full GC 的触发条件
常见场景:
- 老年代空间不足:当老年代无法容纳从年轻代晋升的对象时,触发 Full GC。
- 元空间不足:当元空间(存储类元信息)空间不足时,触发 Full GC。
- 手动调用 System.gc():虽然不一定会立即触发 Full GC,但会建议 JVM 进行垃圾回收。
- 显式分配担保失败:当年轻代的对象无法通过分配担保机制转移到老年代时,触发 Full GC。
底层原理:
- Full GC 使用的是标记-清除或标记-整理算法,扫描整个堆区并回收垃圾对象。
3. 注意事项
优化建议:
- 减少 Young GC:适当增大 Eden 区的大小,避免频繁触发 Young GC。
- 减少 Full GC:合理设置老年代和元空间的大小,避免内存不足。
监控工具:
- 使用 JVM 自带的工具(如
jstat、jvisualvm)监控 GC 行为,分析 GC 日志,找出瓶颈并优化。
💡面试官视角:
- 使用 JVM 自带的工具(如
面试官可能会问“如何监控和分析 GC 行为?”答:可以使用
jstat查看 GC 统计信息,或者通过-XX:+PrintGCDetails输出 GC 日志进行分析。面试官可能会追问“什么是分配担保机制?”答:当年轻代的对象无法放入 Survivor 区时,会尝试将其直接晋升到老年代;如果老年代空间不足,则触发 Full GC。
