【问题标题】:Why G1 Garbage collector is called "Garbage First"?为什么G1垃圾收集器被称为“垃圾优先”?
【发布时间】:2019-02-05 14:16:06
【问题描述】:

在阅读 Oracle 的 documentation on G1 Garbage Collector 时,我注意到以下内容 -

在执行垃圾回收时,G1 以类似于 CMS 回收器的方式运行。 G1 执行一个并发的全局标记阶段来确定整个堆中对象的活跃度。标记阶段完成后,G1 知道哪些区域大部分是空的。它首先在这些区域收集,这通常会产生大量的可用空间。 这就是为什么这种垃圾收集方法被称为 Garbage-First

如上所述,G1 选择大部分为空的区域。

我的问题是,如果任何区域大部分是空的,那将如何产生大量可用内存?如果它大部分是空的,它已经是空闲内存的一部分。不是吗?

这里有人可以帮我澄清一下吗?

【问题讨论】:

    标签: java garbage-collection


    【解决方案1】:

    在这句话中:

    标记阶段完成后,G1 知道哪些区域大部分是空的。

    “mostly empty”表示“包含最多可回收的垃圾”。这从上下文中可以清楚地看出。标记阶段的目的是确定哪些对象是绝对或可能可达的。其余的肯定是无法到达的,可以收集。

    收集可回收空间最多的区域有两个好处:

    1. 您可以尽快获得最多的空间。
    2. 使用复制收集器,如果“发件人”空间主要包含您不需要复制到“收件人”空间的内容,那么要做的工作就会减少。因此,您可以有效地收回最大的空间。

    在大多数用例中,第二个原因更为重要。快速收回空间并不重要。当应用程序请求它时,您只需要可用空间。 (GC暂停是另一回事,但它们是由其他原因引起的。)

    【讨论】:

      【解决方案2】:

      可以将“garbage first”想象成“most garbage-y first”的简写。也就是说,它定义了各种内存块,然后对垃圾最多的内存块进行优先排序——从而获得最大的收益。

      来自您引用的页面:

      G1 集中其收集和压缩活动堆中可能充满可回收对象的区域,即垃圾(强调)

      ... 而不是仅仅将每个内存块都视为对 GC 同样有益,即使其中 99% 包含活动对象。

      【讨论】:

        猜你喜欢
        • 2011-03-18
        • 1970-01-01
        • 2017-05-24
        • 2010-12-19
        • 2014-08-08
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        相关资源
        最近更新 更多