在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/