1. JVM 各种 GC 名词简介总结
JVM 各种垃圾回收器介绍中出现了很多名词:Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC。本篇文章中分别介绍一下。
1.1. Minor GC / Young GC
专门针对新生代的GC —— Minor GC / Young GC,“新生代”也称为“年轻代”。在年轻代中的Eden内存区域被占满之后,就要触发年轻代的gc,或者是新生代的gc。
Young GC一般是在新生代的Eden区域满了之后就会触发,采用复制算法来回收新生代的垃圾。
1.2. Old GC
老年代GC,称为“Old GC”更合适,从字面意义可以理解,就是老年代GC。代表老年代内存区域的垃圾回收。
1.3. Full GC
从字面意思可以理解,“Full”是整体的意思,所以 Full GC 就是对JVM进行整体的垃圾回收(把各个内存区域的垃圾都回收掉)。针对新生代、老年代、永久代的全体内存空间的垃圾回收。
很多时候,大家都把 Full GC 直接等价为 Old GC。从字面意义上来理解,建议把二者分开,Full GC 理解为针对JVM内所有内存区域的一次整体垃圾回收。
老年代空间不够了,这时会触发Full GC,Full GC一般会带上Young GC去回收新生代,也会有Old GC回收老年代,同时还会去回收永久代。(不同的JVM版本的Full GC触发条件可能是不一样的,实现机制也可能不同。)
1.4. Major GC
Major GC 是一个非常容易混淆的概念,建议少提,可以使用 Old GC、Full GC 来明确指定所属区域的垃圾回收。Major GC 通常指老年代回收,但具体行为取决于 GC 回收器:
- Serial/Parallel Old:Major GC = Full GC(完全 STW)。
- CMS:Major GC 可并发执行,但失败后仍会 Full GC。
- G1/ZGC:无独立 Major GC,全堆或混合回收。
1.5. Mixed GC
Mixed GC 是 G1 中特有的概念 —— 混合回收,代表对年轻代和老年代都会进行回收。