gpt4 book ai didi

Java 主要和次要垃圾收集

转载 作者:IT老高 更新时间:2023-10-28 20:34:08 26 4
gpt4 key购买 nike

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

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

现在我的问题:

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

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

提前致谢。

最佳答案

让我解释一下。

Let's take Throughput Collector as an example. (aka Parallel Collector). The docs say it uses multiple threads to do the Minor collections and single thread for Major collections (same as Serial collector).

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

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

下一个问题:

What does it mean by a Full GC: a) Does it mean both Minor and Major collections are done? Or b) Full GC == Major Collections? Which one is it?

和,

Also, 4. Does Full GC only affect OldGeneration or YoungGeneration as well?

这取决于。 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秒]
  • 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]

下一个问题:

If a), does it mean that the Minor Collection is still done using multiple threads whereas the Major was done using Single?

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

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

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

  • -XX:+UseParallelOldGC
  • -XX:+UseConcMarkSweepGC

关于Java 主要和次要垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16549066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com