【问题标题】:Will jvm old gc mark all the heap or just olld heap?jvm old gc 会标记所有堆还是只标记旧堆?
【发布时间】:2019-01-21 02:58:23
【问题描述】:

jvm old gc 会标记所有堆还是只标记旧堆?因为年轻一代 对象可以包含老年代对象。

【问题讨论】:

  • 什么是“旧 gc”?
  • @apangin 收集老年代。
  • 不收集年轻代就没有收集老年代。所以反过来说,minor gc 可能只标记年轻对象,因为旧对象不包含对年轻对象的引用,除非它们被修改。并且支持这种捷径的 JVM 必须跟踪旧对象的修改。

标签: garbage-collection jvm


【解决方案1】:

这取决于您使用的收集器。

有些收集器不使用任何结构来记录年轻代对老年代的引用。理论上,这些收集器必须扫描年轻代以找到垃圾。然而,一些收集器会执行小 gc 而不是扫描年轻代。像CMS(Concurrent Mark Sweep)一样,会扫描年轻代。但是你可以使用选项

-XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark 

在进行完整 gc 或 CMS 备注阶段之前收集年轻代。

但有些收集器不需要扫描年轻代。他们通常使用一些数据结构来记录引用,例如 G1(Garbage First)收集器。它使用 RS(记住集)。 G1 收集器将扫描 RS 以找出参考。例如,如果有一个年轻的区域调用 yr1,则有一个指向旧区域或 1 中的对象的引用。 RS 将添加如下记录:

yr1 -> or1

(RS的实际实现真的很复杂) 因此,在标记周期中,G1 会扫描 RS 以找出所有指向 or1 的参考点。

更多细节:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多