java - 如果对象的大小大于固定大小区域且小于固定大小区域的一半,GC1如何分配对象?

标签 java memory garbage-collection allocation

查看文档 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

  • 因为每组 StartsHumongousContinuesHumongous 区域仅包含一个巨大的对象,即末端之间的空间 巨大物体的末端和最后一个区域的末端 对象未使用。对于仅比一个稍大的物体 堆区域大小的倍数,这个未使用的空间可能会导致 堆变得碎片化。

根据上述文档,不会在该空间中分配其他对象。

关于java - 如果对象的大小大于固定大小区域且小于固定大小区域的一半,GC1如何分配对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51829374/

相关文章:

java - 如何在其他服务实现中从 Spring Security 接收经过身份验证的用户,而不是匿名用户。(Spring Security+JWT)

java - 为什么 Class<T extends Base> 不适用于 Class<Base>?

linux - 打印 Linux 上所有进程累积的内存和 CPU 百分比

c - 通过直接在函数处理程序中使用写入函数的用户空间缓冲区来节省内存(Linux,内核)?

java - Java 可以在作用域结束前收集变量吗?

java - 垃圾收集新生代扫描

java - Google App Engine Blobstore - 打印文件中的 HTML 代码

Java从字符串中删除多个字符

c - HeapReAlloc 改变内存地址后是否应该使用HeapFree?

C# "Out Of Memory Exception"返回变量访问器