G1 GC巨型对象分配

4
在G1 GC的官方文档《垃圾优先垃圾收集器》中,有一部分是这样说的:

然而,对于巨大对象,例如原始类型的数组,如布尔值、各种整数和浮点值,有一个特殊规定。

这些话是什么意思呢?我在谷歌上找不到任何参考资料,Java进程是否直接将其放入了老年代以分配原始类型的数组,我真的很困惑,有人能帮忙解释一下吗?是否有官方解释?

不,它意味着对于原始类型的大型数组与其他大型对象有特殊处理。请阅读整个段落。 - vasquez
1个回答

10
如果数组大小超过半个G1区域(与其他对象相同),那么这些原始类型的数组将被视为巨大对象。然而,当涉及到回收这些数组时,G1会以不同的方式处理它们,即在任何类型的集合暂停期间尝试回收它们。为了安全地执行此操作,收集器需要检查任何链接到数组的链接,以确保不能再访问该数组。这就是为什么文档中说,“如果没有多个对象引用,则G1会机会主义性地尝试回收巨大对象……”这可能有点令人困惑,因为您只希望回收没有引用的对象。
此错误解释了表述方式背后的原理 https://bugs.openjdk.java.net/browse/JDK-8048179 此博客文章提供了更多详细信息 https://blogs.oracle.com/poonam/eager-reclamation-of-humongous-objects-with-g1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接