查看文档 oracle gc1 description 我还没有找到 GC1 算法如何为大小大于区域大小的对象分配内存的答案,例如从 1% 到 20%。据记载,对于大于区域大小一半的对象,将像巨型对象一样进行分配。 从逻辑上讲,它也应该使用多个区域。但是:
1) How close should they be? Should they be contiguous?
2) Can other objects be located in the region, fitted to the rest of the region size, where second part of object located?
最佳答案
它们应该有多近?它们应该是连续的吗?
- 考虑占据超过区域大小一半空间的对象 巨大的物体。它们直接分配在特殊的巨大中 区域,是立即创建的免费的连续区域 终身一代(而不是伊甸园)的一部分。
以上摘自《Optimizing Java》一书中关于 G1 gc 的注释。巨大的区域是连续的。
其他对象是否可以位于该区域中,以适应区域大小的其余部分,即对象的第二部分所在的位置?
第二个答案的以下文档来自 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc_tuning.html#humongous
- 因为每组 StartsHumongous 和 ContinuesHumongous 区域仅包含一个巨大的对象,即末端之间的空间 巨大物体的末端和最后一个区域的末端 对象未使用。对于仅比一个稍大的物体 堆区域大小的倍数,这个未使用的空间可能会导致 堆变得碎片化。
根据上述文档,不会在该空间中分配其他对象。
关于java - 如果对象的大小大于固定大小区域且小于固定大小区域的一半,GC1如何分配对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51829374/