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



所以JVM有2种类型的垃圾收集过程:次要GC和主要GC。还有不同类型的垃圾收集器:串行,并行,CMS,G1C等。这些垃圾收集器根据它们实现的不同算法以不同的方式执行垃圾收集过程。

根据CMS的Oracle文档,

次要

集合可以与正在进行的主要循环交错,并且以类似于并行收集器的方式完成(特别是,应用程序线程在次要收集期间停止(。

这是否意味着所有垃圾回收器仅表征和控制主要 GC?换句话说,无论选择哪个垃圾回收器,次要 GC 的行为是否相同?

收集器是 JVM 的实现细节,以下内容仅涵盖 Oracle/OpenJDK 热点:

最近的收集器,如G1,ZGC,Shenandoah是高度集成的,其中所有GC循环(主要/次要在这里会过于简化(都由特定于该收集器的代码管理。

另一方面,一些较旧的收集器更加模块化,允许您在某种程度上混合搭配。 Jon Masamitsu的博客文章"我们的收藏家"概述了G1之前的收藏家。 请注意,其中一些已在 jdk8 中弃用,并在 jdk9 中删除

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

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

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

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

最新更新