标准答案
- 年轻代回收通常频繁且目标是短命对象,存活对象可能晋升。
- 老年代或混合回收处理更长生命周期对象,成本和停顿取决于收集器与堆状态。
- Full GC 往往涉及更广范围或更重的回收,但具体含义要看 JVM 和收集器日志。
- 排查应看 GC 原因、暂停时间、分配速率、晋升失败和堆占用,而不是只统计次数。
题目解析
Minor、Major 和 Full 的边界在不同收集器和 JDK 版本中并不完全一致,不能只按名称推断停顿和回收范围。应查看日志中的收集器阶段、原因、暂停时间和涉及区域。
年轻代回收通常更频繁,但仍可能造成 Stop-the-World;Full GC 次数增加可能来自分配压力、晋升失败、元空间或显式触发,不等于已经证明存在泄漏。
调优要把分配速率、对象存活、晋升、堆占用、暂停和业务 P99 对齐。只改新生代大小可能把问题转成老年代压力或更长的 Full GC。
常见误区
- 误区:认为 Minor GC 完全没有停顿。改正:确认目标收集器的暂停阶段和实际日志,年轻代回收也可能暂停应用。
- 误区:看到 Full GC 次数就判断内存泄漏。改正:结合触发原因、存活对象、堆转储和分配趋势分析。
- 误区:只调整新生代大小。改正:同时观察对象分配、晋升、老年代、暂停和业务尾延迟。