JVM 数组可以重新分配()吗?

Can a JVM array be realloc()'d?

所以 C 语言有一个 realloc() 过程可以用来增加分配的[编辑] 内存

是否存在 JVM/Java 的等效概念? Arrays 还是 nio.Buffers?我不介意这是 JDK 的一部分还是作为外部库,例如sun.unsafe.

首先,C 函数realloc 不是一个可以增长数组 的工具,而是以前allocated via malloc, calloc, or realloc 的内存。相比之下,C 数组可能驻留在堆栈或静态内存区域,甚至可能嵌入到更大的结构中。

然后,该函数具有像 free 一样使原始指针无效并返回新指针的语义。所以如果你有指针的副本到处乱飞,你有责任用新指针替换所有出现的地方。

当然,Java不支持引用失效。保证每个非null对象引用的有效性,是Java内存管理的基础属性。

所以如果你想要 C 的 realloc 的等价物,你必须使用指针而不是数组。那么sun.misc.Unsafe就有了所有相关操作

  • public long allocateMemory(long bytes)
  • public long reallocateMemory(long address, long bytes)
  • public void freeMemory(long address)
  • public float getXyz(long address)¹
  • public void putXyz(long address, xyz x)¹

¹ 其中“xyz”代表原始类型

如果要调整数组大小,请使用

array = Arrays.copyOf(array, newSize);

这不会使旧引用失效,因此如果您无法替换对旧数组的所有引用,使用这些旧引用的代码将访问旧数组。

但是,如果 array 是对特定数组的唯一引用,或者您的代码已证明替换了所有现有引用,则 JVM may in theory enable an in-place resizing operation instead of copying the contents, see also

但是检查必要的先决条件可能比复制数组内容更昂贵。我可以想象适用性的唯一场景是,如果数组是同一线程分配的最后一个对象,那么可以证明引用还没有转义,并且分配中数组后面没有对象 space.

对于具有这种优化的 JVM,当重复添加到内部 ArrayList, as that class ensures that it is the only holder of the reference to its internal array and it uses Arrays.copyOf 以调整大小时,您可能会自动获得好处。