据我所知,使用G1时,GC会被分割成一组大小相等的堆区域 JVM如何在区域中分配新对象?选择哪个区域进行分配?
答案 0 :(得分:2)
我猜多个Edens的原因是它们是线程本地的。像这样的东西很可能也被其他收藏家使用,因为分配需要很快并且处理共享变量很慢并且规模很大。当这样的Eden耗尽时,需要进行一些同步才能获得一大块VM。
IIUIC G1在选择要收集的区域方面有所不同,而不是如何分配区域。
答案 1 :(得分:1)
来自Oracle Docs:
将堆分区为一组大小相等的堆区域,每个堆区域为a 连续的虚拟内存范围。分配了某些区域集 与旧收藏家一样的角色(伊甸园,幸存者,老人),但是 它们没有固定的大小。这提供了更大的灵活性 在内存使用方面。
答案 2 :(得分:1)
以下是原始Garbage-First Garbage Collection研究论文关于分配的内容:
堆区域中的分配包括在已分配和未分配空间之间递增边界顶部。一个区域是正在分配存储的当前分配区域。由于我们主要关注多处理器,因此mutator线程只使用 compare-and-直接在此堆区域中分配线程局部分配缓冲区或 TLABs 。交换,或CAS,操作。然后,他们在这些缓冲区中私下分配对象,以最大限度地减少分配争用。当填充当前分配区域时,选择新的分配区域。空区域被组织成链接列表,以使区域分配成为恒定时间操作。
通常,您需要意识到 G1 仍然是分代垃圾收集器。因此,这意味着对象分配发生在通常情况下的Young Generation(Eden空间)中。从这个角度来看,G1没有什么新东西。 G1和例如G1之间的区别CMS是将Young Gen分成几个大小相同的区域。
伊甸园地区 在世界各地暂停时收集,对象压缩到To空间,所以它是将这些对象分配到不同的伊甸园区域并不是一个真正的问题。
Humongous object 分配发生在巨大的区域 - 这是分配大型对象的一种特殊情况。