当前位置: 首页 > 知识库问答 >
问题:

MaxTenuringThreshold -它到底是如何工作的?

赫连子石
2023-03-14

我们知道主存域很少:年轻的、终生的(旧的gen)和PermGen。

  • 年轻领域分为伊甸园和幸存者(有两个)。
  • OldGen用于生存的对象。

MaxTenuringThreshold防止对象过早地被最终复制到OldGen空间。这很清楚,也很容易理解。

但是它是如何工作的呢?垃圾回收器如何处理这些在MaxTenuringThreshold之前仍然存在的对象,以何种方式?它们位于何处?

对象被复制回幸存者空间以进行垃圾回收。还是以某种方式发生?

共有2个答案

越涵衍
2023-03-14

(免责声明:仅适用于HotSpot VM)

正如Alexey所说,实际使用的任期阈值是由JVM动态决定的。设置它的价值很小。对于大多数应用程序来说,默认值15已经足够高了,因为通常会有更多的对象在集合中存活下来。当许多对象在集合中幸存时,幸存空间直接溢出到old。这被称为过早提升,是一个问题的指标。然而,它很少能通过调整MaxTenuringThreshold来解决。

在这种情况下,有时可能会使用生存比率来增加幸存者空间中的空间,从而允许任期实际工作。然而,最常见的是,扩大年轻一代是唯一好的选择(从配置的角度)。如果您从编码的角度来看,您应该避免过多的对象分配,让任期按设计工作。

准确地回答您的问题:当一个对象达到其JVM确定的保有权阈值时,它会被复制到旧的。在此之前,它将被复制到空的幸存者空间。存活了一段时间但在达到阈值之前被取消引用的对象会非常有效地从幸存者中清除。

饶曦之
2023-03-14

Java 堆中的每个对象都有一个由垃圾回收 (GC) 算法使用的标头。年轻的空间收集器(负责对象提升)使用此标头中的几位来跟踪幸存下来的集合对象的数量(32 位 JVM 为此使用 4 位,64 位可能更多)。

在年轻的空间收集过程中,每个对象都被复制。对象可以复制到生存空间之一(在年轻GC之前是空的)或旧空间。对于每个被复制的对象,GC 算法会增加它的年龄(幸存的集合数量),如果年龄高于当前的存储阈值,它将被复制(提升)到旧空间。如果生存空间已满(溢出),也可以将对象直接复制到旧空间。

Object的旅程有以下模式:

  • 分配在伊甸园
  • 由于年轻GC从伊甸园复制到生存空间
  • 由于年轻的GC从生存空间复制到(其他)生存空间(这种情况可能发生几次)
  • 由于年轻的GC(或全GC)而从生存(或可能的伊甸园)提升到旧空间

实际的任期阈值由JVM动态调整,但MaxtenuringThreshold对其设置了上限。

如果设置最大阈值=0,则所有对象将立即升级。

我有几篇关于java垃圾收集的文章,在那里你可以找到更多的细节。

 类似资料:
  • 当我创建一个api并使用laravel资源时,是更好地获取完整的数据,然后选择在资源文件中发送哪些列,还是从数据库中选择数据时,确定应该选择哪些列? 1)

  • 问题内容: 我们知道,主要的内存域很少:Young,Tenured(Old gen)和PermGen。 年轻领域分为伊甸园和幸存者(两个)。 OldGen用于保留对象。 MaxTenuringThreshold可以防止将对象最终过早地复制到OldGen空间。这很清楚而且可以理解。 但是它如何工作?垃圾收集器如何处理这些仍存活到MaxTenuringThreshold的对象,并且以什么方式处理?他们

  • 我正在学习Spring核心认证,我对Spring如何处理bean生命周期有一些疑问,特别是bean后处理器。 所以我有了这个模式: 我很清楚这意味着什么: 然后在bean创建阶段执行以下步骤: > 每个bean都在缺省情况下被急切地实例化(按照正确的顺序创建,并注入其依赖项)。 在依赖注入之后,每个bean都会经历一个后处理阶段,在这个阶段中可能会进行进一步的配置和初始化。 > 初始化器:如果指示

  • 这是一个简单的错误:我在对象的格式字符串中使用了而不是。但我完全困惑于我的测试结果与错误的格式字符串。 以下代码: @Jan建议依赖toString()方法可能会有问题,所以我定义了一个日期格式,以与上面相同的代码打印。下面是附加输出:

  • 我几乎理解了尾递归是如何工作的,以及它与普通递归之间的区别。我只是不明白为什么它不要求堆栈记住它的返回地址。 在尾递归函数中调用函数本身后没有什么可做的,但对我来说这没有意义。

  • 根据Javadoc关于字符串。实习生(): 调用intern方法时,如果池中已经包含一个由equals(Object)方法确定的等于此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中并返回对此String对象的引用。 我对此没有什么问题。 当创建一个新的字符串对象(不是使用字符串文字,而是使用new()操作符)时,如: