Java g1gc中的内存分配

Java g1gc中的内存分配,java,garbage-collection,g1gc,Java,Garbage Collection,G1gc,据我所知,在使用G1时,GC堆被划分为一组大小相等的堆区域。 JVM如何在区域中分配新对象?选择哪个地区进行分配 来自: 堆被划分为一组大小相等的堆区域,每个区域都是 虚拟内存的连续范围。指定了某些区域集 与旧收藏家相同的角色(伊甸园、幸存者、老人),但 它们没有固定的尺寸。这提供了更大的灵活性 内存使用 还要检查一下,我想多个Eden的原因是它们是线程本地的。像这样的东西很可能也被其他收集器使用,因为分配需要很快,处理共享变量的速度很慢,而且伸缩性很差。当这样一个Eden耗尽时,需要进行一些

据我所知,在使用G1时,GC堆被划分为一组大小相等的堆区域。
JVM如何在区域中分配新对象?选择哪个地区进行分配

来自:

堆被划分为一组大小相等的堆区域,每个区域都是 虚拟内存的连续范围。指定了某些区域集 与旧收藏家相同的角色(伊甸园、幸存者、老人),但 它们没有固定的尺寸。这提供了更大的灵活性 内存使用


还要检查一下,我想多个Eden的原因是它们是线程本地的。像这样的东西很可能也被其他收集器使用,因为分配需要很快,处理共享变量的速度很慢,而且伸缩性很差。当这样一个Eden耗尽时,需要进行一些同步以获得新的VM块


IIUIC G1的不同之处在于它如何选择要收集的区域,而不是如何分配。

以下是原始研究论文关于分配的内容:

堆区域中的分配包括增加已分配和未分配空间之间的边界top。一个区域是分配存储的当前分配区域。因为我们主要关注多处理器,所以mutator线程只在这个堆区域中直接分配线程本地分配缓冲区,或TLAB,使用比较和交换,或CAS操作。然后,它们在这些缓冲区内私自分配对象,以最小化分配争用。填充当前分配区域后,将选择新的分配区域。空区域被组织成一个链表,以使区域分配成为一个固定时间操作

通常,您需要意识到G1仍然是分代垃圾收集器。因此,这意味着通常情况下,对象分配发生在年轻一代(伊甸园空间)。从这个角度来看,G1中没有什么新东西。G1和例如CMS之间的区别在于年轻一代被分成几个大小相等的区域

伊甸园区域在停止世界暂停时收集,对象被压缩到To空间,因此将这些对象分配到所有不同的伊甸园区域并不是一个真正的问题


庞大的对象分配发生在庞大的区域-这是分配大型对象的一种特殊情况。

但是当分配新对象时,伊甸园区域中的哪一个被放置?@Costa Mirkin:这有什么关系?你如何区分这些地区?您希望得到什么样的答案,“从左起的第三个”?某个区域填充到最后,然后在新区域中分配对象,或者可以在不同的伊甸园区域中执行分配?