Minor GC、Young GC、Old GC、Major GC、Mixed GC、Full GC都是什么?

各个GC的概念

1、Minor GC和Young GC

Minor GC 和 Young GC,“新生代”也可以称之为“年轻代”, 这两个名词是等价的。那么在年轻代中的Eden内存区域被占满之后,实际上就需要触发年轻代的gc,或者是新生代的 gc。

此时这个新生代gc,其实就是所谓的“Minor GC”,也可以称之为“Young GC”,这两个名词,就专门针对新生代的gc。

2、Old GC和Major GC

老年代gc,称之为“Old GC”。

Major GC:可以是指 old GC 也可以是指 Full GC。这是因为JVM规范没有对这些名词有具体的定义,时间久了后就使用混乱了。所以如果讨论 Major GC 的时候需要指定前提到底是讨论的是 old GC 还是 Full GC,比如周志明版的《深入理解虚拟机》就把 old GC 统称为 【Major GC】,这里我们先按照 old GC == Major GC 讨论

3、Mixed GC

Mixed GC是G1中特有的概念,其实说白了,主要就是说在G1中,一旦老年代占据堆内存的45%了,就要触发Mixed GC,此时对年轻代和老年代都会进行回收。

对应的参数设置:“-XX:InitiatingHeapOccupancyPercent”,他的默认值是45%,可以进行按需要修改。

4、Full GC

对于Full GC指的是针对新生代、老年代、永久代的全体内存空间的 垃圾回收,所以称之为Full GC。

从字面意思上也可以理解,“Full”就是整体的意思,所以就是对JVM进行一次整体的垃圾回收,把各个内存区域的垃圾都回收掉。

换句话说,Full GC就是针对JVM内所有内存区域的一次整体垃圾回收。

两个大类partial GC和Full GC:

partial GC: 代表局部垃圾回收,可以有如下细分:

  • young GC(Minor GC): 指的是对新生代区域垃圾回收
  • old GC(Major GC):指的是收集老年代,只有 CMS 的 concurrent collection是这个模式
  • Mixed GC:收集整个新生代,和部分老年代,只有G1有这个模式

Full GC:收集整个过程,包括新生代、老年代、永久代(JDK8之前)

各个GC的触发条件

触发young GC

由于对象一般情况下是直接在新生代中的 Eden 区进行分配,如果Eden区域没有足够的空间,那么就会触发young GC(Minor GC)。因为 Java 对象大多数具备朝生夕死的特性,所以 young GC(Minor GC)会非常频繁,回收速度也非常快。

触发Full GC

Full GC 相对于 Minor GC 来说,停止用户线程的 STW(stop the world)时间过长,至少慢10倍以上,所以要尽量避免,首先说一下Full GC可能产生的原因,接着给出排查方法以及解决策略。

在代码中调用System.gc()方法会建议JVM进行Full GC,但是注意这只是建议,JVM执行不执行是另外一回事儿,不过在大多数情况下会增加Full GC的次数,导致系统性能下降。

一般建议不要手动进行此方法的调用,可以通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc

在Young GC之前,会先检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。

  • 如果小于,说明YGC是不安全的,则会查看参数 HandlePromotionFailure 是否被设置成了允许担保失败,如果不允许则直接触发Full GC;
  • 如果允许,那么会进一步检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果小于也会触发 Full GC

Metaspace(元空间)在空间不足时会进行扩容,当扩容到了-XX:MetaspaceSize 参数的指定值时,也会触发FGC

方法区空间不足时,也会发生Full GC

触发Major GC/Old GC

老年代会在两种情况下触发 Old GC:
一是开启分配担保机制,根据历次 Minor GC 后进入老年代的对象大于当前老年代内存大小,判断 Minor GC 有风险,则会触发 Old GC
二是 Minor GC 后剩余对象太多,老年代放不下了也会触发 Old GC

触发Mixed GC

Mixed GC是G1中特有的概念,当老年代内存占据到了45%就户触发Mixed GC,对新生代和老年代都进行回收

猜你喜欢

转载自blog.csdn.net/weixin_45525272/article/details/127048854