为什么G1垃圾收集器被称为“垃圾优先”?

时间:2019-02-05 14:16:07

标签: java garbage-collection

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

  

执行垃圾收集时,G1以类似于CMS收集器的方式运行。 G1执行并发全局标记阶段,以确定整个堆中对象的活动性。标记阶段完成后, G1知道哪些区域大部分为空。它首先收集在这些区域中,通常会产生大量的自由空间。 这就是为什么这种垃圾收集方法称为“垃圾优先”的原因

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

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

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

2 个答案:

答案 0 :(得分:2)

这句话:

  

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

“大多数为空”是指“包含最可回收的垃圾”。从上下文可以明显看出。标记阶段的目的是确定哪些对象是绝对或可能到达的。其余的肯定是无法到达的,可以收集。

收集可回收空间最大的区域是好的,其原因有两个:

  1. 您将尽快获得最多的空间。
  2. 如果使用“复制”收集器,则“发件人”空间中大部分包含不需要复制到“发件人”空间中的内容,则要做的工作较少。这样您可以有效地获得最大的空间。

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

答案 1 :(得分:0)

将“垃圾优先”视为“最垃圾优先”的简写。也就是说,它定义了各种内存块,然后对那些垃圾最多的内存进行优先级排序,从而最大程度地节省了开支。

在您引用的页面中:

  

G1 集中其收集和压缩活动 到堆中可能充满可回收对象的区域,即垃圾 >。 (添加了重点)

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