首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >G1 GC中的内存分配

G1 GC中的内存分配
EN

Stack Overflow用户
提问于 2013-11-06 18:57:08
回答 3查看 2.3K关注 0票数 4

正如我所理解的,在使用G1时,GC堆被划分为一组大小相等的堆区域。

JVM如何在区域中分配新对象?选择哪个区域进行分配?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-06 22:38:14

以下是原始 垃圾-第一垃圾收集 研究论文对分配的看法:

堆区域中的分配包括在已分配的空间和未分配的空间之间增加边界( top )。一个区域是正在分配存储的当前分配区域。由于我们主要关注多处理器,所以mutator线程使用compare-and-swap,或只分配线程本地分配缓冲区或TLABs。然后,他们在这些缓冲区中私有地分配对象,以最小化分配争用。当填充当前分配区域时,将选择一个新的分配区域。空区域被组织成一个链接列表,以使区域分配成为一个恒定的时间操作。

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

Eden regions是在停止世界暂停中收集的,对象被压缩到To space中,所以将这些对象分配到不同的伊甸园区域并不是一个问题。

大型对象分配发生在大型对象区域--这是大型对象分配的特例。

票数 1
EN

Stack Overflow用户

发布于 2013-11-06 19:54:33

我想是因为他们是线程本地的。这样的东西很可能也被其他收集器所使用,因为分配需要快速,并且处理共享变量的速度很慢,而且扩展性很差。当这样的Eden耗尽时,需要进行一些同步才能获得新的VM块。

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

票数 2
EN

Stack Overflow用户

发布于 2013-11-06 19:01:21

来自Oracle Docs

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

也可以检查垃圾优先垃圾收集器调优

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19820443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档