【发布时间】:2019-10-11 20:21:39
【问题描述】:
因此,C 语言有一个realloc() 过程,可用于就地增加分配的[编辑]内存。
JVM/Java 是否存在等效概念?对于Arrays 还是nio.Buffers?我不介意这是 JDK 的一部分还是作为外部库,例如sun.unsafe.
【问题讨论】:
-
AFAIK,
realloc分配一个新的内存块,并将内容复制到那里,然后释放原始的(尽管它声称如果碰巧没有内存,它可能会增长它在它背后......无疑是一个罕见的案例)。ArrayList正是这样做的,但它是透明的(即,它会在需要时自动增长)。 -
@john16384 通过
System::arrayCopy在内部复制数组;但在其他方面完全正确 -
我对扩展现有块的能力特别感兴趣,而不是“复制它”。我在哪里可以找到这种效果的证据@john16384,你说“无疑是一个罕见的案例”——你的依据是什么?也许这个问题的标题应该是“是否有可能在 JVM 堆中增加现有分配”以使这一点更清楚。
-
JVM 可能会在内部执行类似的操作,但是从您的 Java 代码中,您无法以任何方式控制它。你不能拿
byte[]要求更大的,你只能创建一个新的。至于我声称在 C 中增长数组是一种罕见的情况——内存会碎片化,如果你为你的 C 程序编写自己的分配策略,你可以对此进行一些控制,但是,随着许多分配的发生,正确的机会尚未使用的区域很小。