当前位置: 首页 > 面试题库 >

Java主要和次要垃圾回收

澹台昆
2023-03-14
问题内容

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

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

现在我的问题是:

  1. 完整GC的含义是什么:a)是否意味着次要收藏和主要收藏都已完成?或b)完整GC ==主要收藏?哪一个?
  2. 如果是a),是否意味着次要集合仍使用多个线程完成,而主要集合仍使用单个线程完成?
  3. 如果是b),是否意味着年轻一代和老一代都使用单线程清除了?

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

提前致谢。


问题答案:

让我解释。

让我们以吞吐量收集器为例。(又名Parallel
Collector)。文档说它使用多个线程来进行次要集合,而使用单个线程来进行主要集合(与串行收集器相同)。

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

当JVM无法为新对象分配空间时会触发次要收集(请记住:新对象始终在Young Generation的Eden区域中分配)。

下一个问题:

完整GC的含义是什么:a)是否意味着次要收藏和主要收藏都已完成?或b)完整GC ==主要收藏?哪一个?

和,

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

这取决于。JVM将每个主要集合报告为完整GC。[尝试使用这些标志java -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamp]。根深蒂固的定义是,Full GC首先运行Minor,然后运行Major(尽管如果Old
Generation已满,则可以切换顺序,在这种情况下,它首先被释放以允许其接收Young Generation的对象)。

好,回到重点。JVM认为[较旧(或Perm)代中的] Major Collection是Full
GC。以下是我能够快速编写以说明这一点的程序的输出。第一行是次要GC,第二行是主要(完整)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),是否意味着次要集合仍使用多个线程完成,而主要集合仍使用单个线程完成?

是。看到我的答案的开始。年轻人和老年人由不同的收藏家服务。对于年轻一代,您可以使用以下任意一种:

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

对于旧一代,可用的选择是:

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


 类似资料:
  • 主要内容:1 什么是Java 垃圾回收,2 Java 垃圾回收的优势,3 如何取消对象引用,4 finalize()方法,5 gc()方法,6 Java 垃圾回收的例子1 什么是Java 垃圾回收 在Java中,垃圾意味着未引用的对象。 垃圾回收是自动回收运行时未使用的内存的过程。换句话说,这是销毁未使用对象的一种方法。 我们在C语言中使用free() 函数,在C ++中使用delete()。但是,在Java中它是自动执行的。因此,java提供了更好的内存管理。 2 Java 垃圾回收的优势 它

  • 问题内容: 我想知道Java中发生的垃圾回收。它真的能够处理所有未使用的对象并释放最大可能的内存吗? 我还想知道Java垃圾收集与另一种语言(例如C#)相比如何?然后,如何自动垃圾收集与从像C这样的语言中进行手动收集相比又能达到更好的效果呢? 问题答案: 是的,这就是垃圾收集的重点。 有许多不同形式的垃圾收集。如果不增强算法,最简单的形式即引用计数就无法处理某些类型的垃圾(循环引用)。 Java(

  • 我试图了解垃圾收集是如何工作的。我很清楚以下几点: 当JVM无法将对象分配给年轻一代时,它将触发小型GC 列表项 当堆满时,JVM将触发完整的GC(两个次要的主要GC)。 但是,年轻一代和老一代中不再引用、符合GC条件但没有触发GC的对象如何(即年轻/老一代堆空间未满,因此没有GC发生) 这是否意味着在GC发生之前,这些对象将保留在年轻/老一代堆空间中? 我的阅读材料 > http://www.c

  • 问题内容: 在学习OCJP时,我遇到了以下问题: 当// doStuff到达时,有多少个对象可以使用GC? 正确答案是2,含义及其目的。 当到达// doStuff行时,c3也为null。为什么它也没有资格获得GC? 问题答案: c3是带有空引用的本地句柄,它不指向(并且已经指向了)分配的对象。因此,GC无需任何操作。

  • 垃圾回收 我们对生产中花了很多时间来调整垃圾回收。垃圾回收的关注点与Java大致相似,尽管一些惯用的Scala代码比起惯用的Java代码会容易产生更多(短暂的)垃圾——函数式风格的副产品。Hotspot的分代垃圾收集通常使这不成问题,因为短暂的(short-lived)垃圾在大多情形下会被有效的释放掉。 在谈GC调优话题前,先看看这个Attila的报告,它阐述了我们在GC方面的一些经验。 Scal

  • 对于开发者来说,JavaScript 的内存管理是自动的、无形的。我们创建的原始值、对象、函数……这一切都会占用内存。 当我们不再需要某个东西时会发生什么?JavaScript 引擎如何发现它并清理它? 可达性(Reachability) JavaScript 中主要的内存管理概念是 可达性。 简而言之,“可达”值是那些以某种方式可访问或可用的值。它们一定是存储在内存中的。 这里列出固有的可达值的