JVM 数组可以重新分配()吗?
Can a JVM array be realloc()'d?
所以 C 语言有一个 realloc()
过程可以用来增加分配的[编辑] 内存。
是否存在 JVM/Java 的等效概念? Array
s 还是 nio.Buffer
s?我不介意这是 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
以调整大小时,您可能会自动获得好处。
所以 C 语言有一个 realloc()
过程可以用来增加分配的[编辑] 内存。
是否存在 JVM/Java 的等效概念? Array
s 还是 nio.Buffer
s?我不介意这是 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
以调整大小时,您可能会自动获得好处。