【问题标题】: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”表示“包含最多可回收的垃圾”。这从上下文中可以清楚地看出。标记阶段的目的是确定哪些对象是绝对或可能可达的。其余的肯定是无法到达的,可以收集。
收集可回收空间最多的区域有两个好处:
- 您可以尽快获得最多的空间。
- 使用复制收集器,如果“发件人”空间主要包含您不需要复制到“收件人”空间的内容,那么要做的工作就会减少。因此,您可以有效地收回最大的空间。
在大多数用例中,第二个原因更为重要。快速收回空间并不重要。当应用程序请求它时,您只需要可用空间。 (GC暂停是另一回事,但它们是由其他原因引起的。)
【解决方案2】:
可以将“garbage first”想象成“most garbage-y first”的简写。也就是说,它定义了各种内存块,然后对垃圾最多的内存块进行优先排序——从而获得最大的收益。
来自您引用的页面:
G1 集中其收集和压缩活动堆中可能充满可回收对象的区域,即垃圾。 (强调)
... 而不是仅仅将每个内存块都视为对 GC 同样有益,即使其中 99% 包含活动对象。