GC类型划分
JVM在发生GC时,主要作用的区域有三个:新生代、年老代以及元数据空间,当然,程序运行期间,绝大多数GC都是在回收新生代。一般而言,GC可以分为四种类型,如下:
- ①新生代收集:只针对新生代的GC,当
Eden
区满了时触发,Survivor
满了并不会触发。 - ②年老代收集:针对年老代空间的GC,不过目前只有
CMS
存在单独回收年老代的行为。 - ③混合收集:指收集范围覆盖整个新生代空间及部分年老代空间的GC,目前只有
G1
存在该行为。 - ④全面收集:覆盖新生代、年老代以及元数据空间的GC,会对于所有可发生GC的内存进行收集。
1、新生代收集(MinorGC/YoungGC)
发生在新生代的GC也被称为MinorGC
或YoungGC
,在JVM中,发生次数最多的也就是新生代GC,毕竟新生代中的对象都是朝生夕死的,也是分配最为频繁的,所以新生代GC也是触发最频繁的。不过新生代GC只有Eden
区满了才会触发,而Survivor
区满了后是不会触发的。对于大部分Java程序而言,新生代GC造成的STW停顿几乎可以忽略不计,因为新生代GC只需要标记出垃圾对象即可,对于存活对象移动的工作量是比较小的。
2、年老代收集(Major GC/Old GC)
当老年代满时会触发MajorGC
,当然在有些地方也被称为OldGC
,但一般而言,年老代GC触发时往往都会伴随新生代GC一起发生,只有CMS收集器会有单独收集年老代空间的行为,其他收集器均无此行为。
3、混合收集(MixedGC)
混合收集MixedGC
是指收集范围覆盖整个新生代空间及部分年老代空间的GC,但目前只有G1
存在该行为,其他收集器均不支持,因为G1
收集器是逻辑分代,物理分区的结构,所以可以针对于不同的分区进行单独的收集,在发生GC时,可以选取新生代分区+部分年老代分区进行回收。
4、全面收集(FullGC)
全面收集也被称为FullGC
,是所有GC类型中,耗时最长、停顿最久的GC,FullGC会对于所有可发生GC的区域进行全面回收,其中涵盖新生代、年老代以及元数据空间,而一般触发FullGC的原因有如下几种:
- ①调用
System.gc()
时,JVM在内存占用较多时会尝试发生FullGC
,但并非100%触发。 - ②除
CMS
之外收集器,**当年老代不足时也会触发FullGC
**。 - ③元数据空间内存不足时,也会触发
FullGC
。 - ④对象晋升时年老代空间无法承载晋升对象时也会触发
FullGC
。 - ⑤新生代空间分配担保机制触发时,也会先触发
FullGC
。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elmer的博客!