Java虚拟机面试题 - Java 中的 young GC、old GC、fullGC 和 mixed GC 的区别是什么?
一、垃圾回收概述
Java 的垃圾回收(GC)是自动内存管理机制,负责回收不再使用的对象以释放内存空间。Java 堆内存通常被划分为不同区域,针对不同区域有不同的垃圾回收方式。
二、Young GC (年轻代垃圾回收)
Young GC 主要回收年轻代(Eden区和Survivor区)的对象。
特点:
- 触发条件:Eden区空间不足时
- 回收目标:清理年轻代中不再使用的对象
- 执行频率:高
- 执行时间:短
三、Old GC (老年代垃圾回收)
Old GC 主要回收老年代的对象。
特点:
- 触发条件:老年代空间不足时
- 回收目标:清理老年代中不再使用的对象
- 执行频率:低
- 执行时间:较长
注意:在部分GC实现中(如CMS),Old GC和Full GC是不同的概念。
四、Full GC (完全垃圾回收)
Full GC 会回收整个堆内存(包括年轻代和老年代)以及方法区(元空间)。
特点:
- 触发条件:
- 老年代空间不足
- 方法区空间不足
- System.gc()调用(不建议)
- 堆内存分配失败
- 回收目标:整个堆和方法区
- 执行时间:长,通常会导致明显的应用暂停
五、Mixed GC (混合垃圾回收)
Mixed GC 是G1垃圾回收器特有的概念,它会回收整个堆内存中的一部分区域(包括年轻代和部分老年代)。
特点:
- 触发条件:G1收集器根据预测模型决定
- 回收目标:年轻代+部分老年代(根据回收效益选择)
- 执行时间:介于Young GC和Full GC之间
- 优势:减少完全GC的频率
六、四种GC类型的对比
类型 | 回收区域 | 触发条件 | 执行频率 | 暂停时间 | 主要回收器 |
---|---|---|---|---|---|
Young GC | 年轻代 | Eden区满 | 高 | 短 | 所有 |
Old GC | 老年代 | 老年代满 | 低 | 中 | CMS |
Full GC | 整个堆+方法区 | 内存不足等 | 最低 | 长 | 所有 |
Mixed GC | 年轻代+部分老年代 | G1预测 | 中 | 中 | G1 |
七、GC类型与垃圾回收器的关系
不同的垃圾回收器实现这些GC类型的方式不同:
-
Serial/Parallel收集器:
- Young GC: 使用标记-复制算法
- Full GC: 使用标记-整理算法
-
CMS收集器:
- Young GC: 并行标记-复制
- Old GC: 并发标记-清除
- Full GC: 后备方案(当并发失败时)
-
G1收集器:
- Young GC: 类似其他收集器
- Mixed GC: 回收部分老年代区域
- Full GC: 后备方案(当回收速度跟不上分配速度时)
八、优化建议
- 尽量减少Full GC的发生
- 合理设置堆大小和各代比例
- 根据应用特点选择合适的垃圾回收器
- 监控GC日志,分析GC性能瓶颈
通过理解这些GC类型的区别和特点,可以更好地调优Java应用的内存性能。