【问题标题】:How minor garbage collection skips older generations?次要垃圾收集如何跳过老一代?
【发布时间】:2013-11-09 16:11:41
【问题描述】:

Minor garbage collection 声称非常有效,因为它不会扫描老年代。

次要垃圾收集如何在不扫描的情况下检测到没有对来自永久或永久存储的年轻对象的引用?

【问题讨论】:

    标签: java garbage-collection


    【解决方案1】:

    看看Understanding GC pauses in JVM, HotSpot's minor GC,这篇文章将为你详细解释年轻的GC机制和HotSpot JVM中的编写障碍。

    简而言之,老年代没有被跳过。所有从 old 到 new 的引用都被视为年轻空间 GC 的根(同样,所有从 new 到 old 的引用都被视为 old space GC 的根)。诀窍是写屏障只允许扫描旧空间的一小部分以查找对年轻空间的所有引用。

    【讨论】:

    • 关于垃圾收集暂停的非常好的博客。谢谢。
    【解决方案2】:

    它没有。在执行时,在引用分配(称为写屏障)上运行的小段代码会记录这些从旧到新的引用(特定对象或堆的小子区域以节省空间)。次要 GC 确实查看那些(罕见的)旧对象,它只是跳过那些已知不包含年轻引用的对象

    【讨论】:

    • 为什么不标记较年轻的对象(从较早的代中引用)并避免扫描较旧的对象?您能推荐进一步阅读吗?
    • @Basilevs 当然,你可以这样做。但通常不会这样做,因为它有很大的缺点。如果稍后覆盖引用,则无论如何都会提升年轻对象并一直保留到下一次主要 GC。而且它与世代假设的交互很差,因为您现在需要扫描整个 Nursery 以提升对象 - 如果大多数 Nursery 都死了,世代 GC 最有效,所以这会浪费时间。此外,节省的费用并没有您想象的那么大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多