java - G1 GC 巨大对象分配

标签 java arrays garbage-collection

在G1 GC的官方文档中,Garbage-First Garbage Collector ,有一段是这样说的:

There is, however, a special provision for humongous objects for arrays of primitive types for example, bool, all kinds of integers, and floating point values.

这几个词是什么意思?我在google中找不到任何引用,java进程是否直接将其放入Tenured Generation中分配原始类型的数组,我真的很困惑,任何人都可以帮助我,是官方解释吗?

最佳答案

如果数组大小超过 G1 区域的一半(与其他对象相同),则这些基元的数组将被视为巨大对象。然而,当谈到回收这些数组时,G1 会以不同的方式对待它们,因为它会在任何类型的收集暂停期间尝试回收它们。为了安全地做到这一点,收集器需要检查数组的任何链接以确保它不再被访问。这就是为什么文档说,“如果大量对象没有被许多对象引用,G1 会机会主义地尝试回收它们......”这可能看起来有点令人困惑,因为您希望仅在没有引用的情况下回收某些东西。

这个错误解释了这种措辞方式背后的基本原理 https://bugs.openjdk.java.net/browse/JDK-8048179

此外,这篇博文提供了更多详细信息 https://blogs.oracle.com/poonam/eager-reclamation-of-humongous-objects-with-g1

关于java - G1 GC 巨大对象分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52146969/

相关文章:

java - 如何为 Java 指定服务器首选的 SSL 密码套件顺序?

java - Eclipse LibGdx GPGS

javascript - 通过给定键从键,值对象中查找值

objective-c - 数组未按预期在 iOS 项目中填充

algorithm - haskell 垃圾收集器

java - 将列表映射到另一个列表并修改字段 [Mapstruct]

java - 在java中通过静态方法访问私有(private)变量

javascript - 如何在 Javascript 中对数组值使用 split() 方法?

c - 当对象/表被垃圾回收时如何通知主机应用程序

c# - 这种 GC.SuppressFinalize() 的使用感觉不对