Full GC 和 Minor GC,傻傻分不清楚

这篇文章主要来介绍下 JVM 中的各类 GC,让你们来搞清楚这几个概念。html

你们可能见到过不少的 GC 名词,好比:Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC。spa

这么多概念,想一想都头疼,到底各类乱七八糟的 GC 指的是什么?htm

下面先引用 R 大在知乎上的回答:内存

针对 HotSpot VM 的实现,它里面的 GC 其实准确分类有两种:ci

  • Partial GC(局部 GC): 并不收集整个 GC 堆的模式get

    • Young GC: 只收集 Young Gen 的 GC,Young GC 还有种说法就叫作 Minor GC
    • Old GC: 只收集 old gen 的 GC,只有垃圾收集器 CMS 的 concurrent collection 是这个模式
    • Mixed GC: 收集整个 Young Gen 以及部分 old gen 的 GC,只有垃圾收集器 G1 有这个模式
  • Full GC: 收集整个堆,包括新生代,老年代,永久代(在 JDK 1.8 及之后,永久代被移除,换为 metaspace 元空间)等全部部分的模式

接下来让咱们再来了解下各个 GC:虚拟机

(1)Minor GC / Young GCit

首先咱们先来看下 Minor GC / Young GC,你们都知道,新生代(Young Gen)也能够称之为年轻代,这两个名词是等价的。那么在年轻代中的 Eden 内存区域被占满以后,实际上就须要触发年轻代的 GC,或者是新生代的 GC。io

此时这个新生代 GC,其实就是所谓的 Minor GC,也能够称之为 Young GC,这两个名词,相信你们就理解了,说白了,就专门针对新生代的 GC。垃圾回收

(2)Old GC

所谓的老年代 GC,称之为 Old GC 更加合适一些,由于从字面意义上就能够理解,这就是所谓的老年代 GC。

可是在这里之因此咱们把老年代 GC 称之为Full GC,其实也是能够的,只不过是一个字面意思的多种不一样的说法。

为了更加精准的表述这个老年代 GC 的含义,能够把老年代 GC 称之为 Old GC。

(3)Full GC

对于 Full GC,其实这里有一个更加合适的说法,就是说 Full GC 指的是针对新生代、老年代、永久代的全体内存空间的垃圾回收,因此称之为 Full GC。

从字面意思上也能够理解,Full 就是总体的意思,因此就是对 JVM 进行一次总体的垃圾回收,把各个内存区域的垃圾都回收掉。

(4)Major GC

还有一个名词是所谓的 Major GC,这个其实通常用的比较少,他也是一个很是容易混淆的概念。

有些人把 Major GC 跟 Old GC等价起来,认为他就是针对老年代的 GC,也有人把 Major GC 和 Full GC 等价起来,认为他是针对 JVM 全体内存区域的GC。

因此针对这个容易混淆的概念,建议你们之后少提。若是听到有人说这个 Major GC的概念,你们能够问清楚,他究竟是想说 Old GC 呢?仍是 Full GC 呢?

(5)Mixed GC

Mixed GC 是 G1 中特有的概念,其实说白了,主要就是说在 G1 中,一旦老年代占据堆内存的 45%(-XX:InitiatingHeapOccupancyPercent:设置触发标记周期的 Java 堆占用率阈值,默认值是 45%。这里的Java 堆占比指的是 non_young_capacity_bytes,包括 old + humongous),就要触发 Mixed GC,此时对年轻代和老年代都会进行回收。Mixed GC 只有 G1 中才会出现。

参考

https://tech.meituan.com/2016...

https://www.zhihu.com/questio...

《深刻理解Java虚拟机:JVM高级特性与最佳实践(第3版)》

相关文章
相关标签/搜索