一、基础概念
Full GC(全局垃圾回收)
是指 清理整个Java堆内存(包括年轻代和老年代)以及方法区(元空间) 的垃圾回收过程。它是Java虚拟机中最耗时、对应用性能影响最大的一种垃圾回收操作,通常会导致应用程序线程的暂停
二、详细解释
要深入理解 Full GC,我们需要先了解Java内存模型和垃圾回收的基本分代理论
1. Java堆内存的分代
a、年轻代 (Young Generation)
新创建的对象首先被分配在这里。年轻代又分为一个 Eden区
和 两个 Survivor区
Eden区【伊甸园】:新创建的对象绝大部分都分配在这里,当Eden区被填满时,会触发一次 Minor GC【每呢 GC】
Survivor区【幸存者区】:是年轻代的一部分,专门用来存放在一次 Minor GC【每呢 GC】
后仍然存活的对象
b、老年代 (Old Generation)
从年轻代晋升过来的对象:在 Survivor区【幸存者区】
经历了多次 Minor GC【每呢 GC】
后仍然存活的对象
大对象:如果对象非常大(比如很长的数组或字符串),可能会直接分配在老年代(避免在Eden和Survivor区之间进行大量复制)
c、老年代 (Old Generation)
方法区是一个线程共享的内存区域,它存储的是已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
三、Full GC 的核心触发条件
1. 老年代空间不足(最常见)
具体场景:
-
年轻代对象晋升:
Minor GC【每呢 GC】
后,存活对象需要晋升到老年代,但老年代空间不足 -
大对象直接分配:大对象(如大数组)直接进入老年代,但空间不足