Java 主要和次要垃圾收集

Posted

技术标签:

【中文标题】Java 主要和次要垃圾收集【英文标题】:Java Major and Minor Garbage Collections 【发布时间】:2013-05-14 17:14:01 【问题描述】:

我一直在阅读 Java 中的垃圾收集和 SO Q&A,但我对垃圾收集的类型感到困惑。

我们以吞吐量收集器为例。 (又名并行收集器)。文档说它使用多个线程来执行 Minor 集合,并为 Major 集合使用单线程(与串行收集器相同)。

现在我的问题:

    Full GC 是什么意思:a) 是否意味着 Minor 和 Major 收集都已完成?或者 b) Full GC == Major Collections?是哪一个? 如果 a),这是否意味着 Minor Collection 仍然使用多线程完成,而 Major Collection 使用 Single 完成? 如果是 b),是否意味着年轻代和老年代均已使用单线程清除?

另外, 4. Full GC 是否也只影响 OldGeneration 或 YoungGeneration?

提前致谢。

【问题讨论】:

+1 。感谢您提出我的问题 【参考方案1】:

让我解释一下。

我们以吞吐量收集器为例。 (又名并行收集器)。文档说它使用多个线程来执行 Minor 集合,并使用单个线程来执行 Major 集合(与 Serial 收集器相同)。

这里有一点要理解。默认情况下,在大多数较新的系统上,JVM 为年轻代和老年代使用两个不同的垃圾收集器。在我的机器上:我有 Parallel New Collector 用于年轻一代,并发标记和扫描收集器用于老一代。

当 JVM 无法为新对象分配空间时触发 Minor Collection(请记住:新对象始终分配在年轻一代的伊甸园区域)。

下一个问题:

Full GC 是什么意思:a) 这是否意味着 Minor 和 Major 收集都已完成?或者 b) Full GC == Major Collections?是哪一个?

和,

另外,4. Full GC 是否也只影响 OldGeneration 或 YoungGeneration?

这取决于。 JVM 将每个 Major Collection 报告为 Full GC。 [尝试使用这些标志java -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamp]。学究式的定义是 Full GC 先运行 Minor,然后运行 ​​Major(尽管如果老年代已满,则可以切换顺序,在这种情况下,它首先被释放以允许它从年轻代接收对象)。

好的,回到正题。 JVM 将 Major Collection [in the Older (or Perm) Generation] 视为 Full GC。以下是我能够快速编写的程序的输出来说明这一点。第一行是 Minor GC,第二行是 Major (Full) GC。您可以看到它只发生在老年代 (CMS) 中,并且能够将老年代从 1082K 减少到 1034K。

11.431: [GC 11.431: [ParNew: 1152K->128K(1152K), 0.0009893 secs] 2111K->1210K(6464K), 0.0010182 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 17.882: [Full GC (System) 17.882: [CMS: 1082K->1034K(5312K), 0.0212614 secs] 2034K->1034K(6464K), [CMS Perm : 9426K->9410K(21248K)], 0.0213200 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

下一个问题:

如果 a),是否意味着 Minor Collection 仍然使用多线程完成,而 Major Collection 使用 Single 完成?

是的。请参阅我的答案的开头。年轻代和老一代由不同的收集器提供服务。对于年轻代,您可以使用以下任何一种:

-XX:+UseSerialGC -XX:+UseParallelGC -XX:+UseParNewGC

对于老年代,可用的选择是:

-XX:+UseParallelOldGC -XX:+UseConcMarkSweepGC

【讨论】:

HotSpot 6(虽然不是第一个版本)和 7 中还有 -XX:+UseG1GC,它同时管理年轻代和年老代。 我需要澄清一下,主要的 GC 也会收集 pern gen 吗?还是完整的 GC 呢?【参考方案2】:

虽然哥布林的回答在广义上仍然是正确的,但至少这部分现在已经过时了:

这取决于。 JVM 将每个 Major Collection 报告为 Full GC。

CMS 和 G1 都区分新生代(次要)收集、老年代的并发收集和完整 gcs。后者是不得已而为之的事情,大部分 GC 应该由新一代和并发集合处理。

【讨论】:

以上是关于Java 主要和次要垃圾收集的主要内容,如果未能解决你的问题,请参考以下文章

Java垃圾回收机制是啥?

Java垃圾收集机制

JVM垃圾收集机制

java虚拟机学习--垃圾收集算法

java垃圾收集描述

Java 中的垃圾收集器