当我读甲骨文的关于G1垃圾收集器的文档时,我注意到-
在执行垃圾回收时,G1的操作方式类似于CMS收集器。G1执行一个并发的全局标记阶段,以确定整个堆中对象的活性。在标记阶段完成后,G1知道哪些区域大部分是空的。它首先聚集在这些地区,通常产生大量的自由空间。这就是为什么这种垃圾收集方法称为“垃圾优先”()。
如前所述,G1选择大部分为空的区域。
我的问题是,如果任何区域都是空的,那怎么会产生大量的空闲内存呢?如果它大部分是空的,那么它已经是空闲内存的一部分。不是吗?
这里有人能帮我澄清一下吗?
发布于 2019-02-05 23:51:25
在这个句子中:
标记阶段完成后,G1知道哪些区域大部分是空的。
“大多是空的”意思是“包含最可回收的垃圾”。从上下文中可以清楚地看到这一点。标记阶段的目的是确定哪些对象是绝对可触及的,或者可能是可达的。其余的绝对是不可及的,可以收集。
收集面积最大的区域是好的,原因有二:
在大多数用例中,第二个原因更有意义。快速恢复空间是很少重要的。当应用程序请求时,您只需要可用的空间。(GC暂停是另一回事,但它们是由其他原因引起的。)
发布于 2019-02-05 23:45:24
把“垃圾第一”看作是“大多数垃圾优先”的缩写。也就是说,它定义了各种记忆块,然后对垃圾最多的记忆进行排序--从而得到最大的回报。
从你引用的那一页:
G1将其收集和压缩活动集中在堆中可能充满可回收对象的区域(即垃圾)上。(强调后加)
..。而不是仅仅把每一块内存当作对GC有利的东西,即使99%的内存包含活动对象。
https://stackoverflow.com/questions/54536378
复制相似问题