Java 垃圾收集器是否特定于 Major GC?

Are Java Garbage Collectors specific to Major GC?

所以 JVM 有两种类型的垃圾收集过程:Minor GC 和 Major GC。并且有不同类型的垃圾收集器:串行、并行、CMS、G1C 等。这些垃圾收集器根据它们实现的不同算法执行不同的垃圾收集过程。

根据 CMS 的 Oracle 文档,

Minor collections can interleave with an ongoing major cycle, and are done in a manner similar to the parallel collector (in particular, the application threads are stopped during minor collections).

这是不是意味着所有的Garbage collectors都只表征和控制Major GC?换句话说,无论选择哪种垃圾收集器,Minor GC 的行为都是一样的吗?

Collectors是JVMs的实现细节,以下仅涵盖Oracle/OpenJDK热点:

最近的收集器,如 G1、ZGC、Shenandoah 高度集成,其中所有 GC 周期(major/minor 在这里会过于简单化)由特定于该收集器的代码管理。

另一方面,一些较旧的收集器更加模块化,允许您在某种程度上混合搭配。 Jon Masamitsu 的博客 post Our Collectors 概述了 G1 之前的收藏家。 请注意,其中一些已在 jdk8 和 removed in jdk9

中弃用

大多数 GC 设计都使用分代堆(Shenandoah 是个例外)。典型的堆分为年轻代和老年代,反映了对象使用了多长时间。当年轻代需要收集时会发生次要 GC,而当老年代需要收集时会发生主要 GC。确实。

其工作原理完全取决于所使用的算法。通常,不同的收集算法用于不同的世代。这很有意义,因为年轻一代中的对象将在 GC 期间被提升(即删除),而老年代中的对象。必须留在那里。各个算法的工作方式可能有助于设计能够重叠年轻代和老年代的集合,但这不是必需的。

Azul(我为之工作)的 Zing JVM 中使用的 C4 算法使用分代堆,但对年轻人和老年人使用相同的算法。 C4 是完全并发的,这意味着应用程序线程在 GC 发生时继续 运行。弱分代假设(大多数对象只会在很短的时间内使用)使这种设计更加高效。

为了回答您的具体问题,无论选择哪个垃圾收集器,次要 GC 的行为都不相同。