Java JVM数组是否可以是realloc()';D

Java JVM数组是否可以是realloc()';D,java,jvm,realloc,Java,Jvm,Realloc,因此,C语言有一个realloc()过程,可以用来增加分配的[edit]内存 JVM/Java是否存在相同的概念?对于Arrays或nio.Buffers?我不介意它是JDK的一部分,还是作为外部库,例如sun.unsafe首先,C函数realloc不是一个可以增加数组的工具,而是以前的内存。相比之下,C数组可以驻留在堆栈或静态内存区域上,甚至可以嵌入到更大的结构中 然后,该函数具有使原始指针无效的语义,如freedoes并返回新指针。因此,如果您有指针的副本四处飞舞,您的职责就是用新指针替换所

因此,C语言有一个
realloc()
过程,可以用来增加分配的[edit]内存


JVM/Java是否存在相同的概念?对于
Array
s或
nio.Buffer
s?我不介意它是JDK的一部分,还是作为外部库,例如sun.unsafe

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

然后,该函数具有使原始指针无效的语义,如
free
does并返回新指针。因此,如果您有指针的副本四处飞舞,您的职责就是用新指针替换所有出现的内容

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

因此,如果您想要与C的realloc等价,那么必须使用指针而不是数组。然后
sun.misc.Unsafe
执行所有相关操作

  • 公共长分配器内存(长字节)
  • 公共长reallocatemory(长地址,长字节)
  • public void freemory(长地址)
  • public float getXyz(长地址)
    imk
  • public void putXyz(长地址,xyz x)
    imk
其中“xyz”表示基本类型

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

array = Arrays.copyOf(array, newSize);
这不会使旧引用无效,因此如果无法替换对旧数组的所有引用,则使用这些旧引用的代码将访问旧数组

但是,如果
array
是对特定数组的唯一引用,或者您的代码替换了所有现有引用,则理论上可以启用就地调整大小操作,而不是复制内容,另请参见

但是检查必要的前提条件可能比复制数组内容更昂贵。我能想象的唯一适用性场景是,如果数组是同一线程分配的最后一个对象,那么可以证明引用尚未逃逸,并且在分配空间中数组后面没有对象


对于具有这种优化功能的JVM,您可以在重复添加到时自动获得好处,因为该类确保它是其内部数组引用的唯一持有者,并在内部用于调整大小。

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

然后,该函数具有使原始指针无效的语义,如
free
does并返回新指针。因此,如果您有指针的副本四处飞舞,您的职责就是用新指针替换所有出现的内容

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

因此,如果您想要与C的realloc等价,那么必须使用指针而不是数组。然后
sun.misc.Unsafe
执行所有相关操作

  • 公共长分配器内存(长字节)
  • 公共长reallocatemory(长地址,长字节)
  • public void freemory(长地址)
  • public float getXyz(长地址)
    imk
  • public void putXyz(长地址,xyz x)
    imk
其中“xyz”表示基本类型

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

array = Arrays.copyOf(array, newSize);
这不会使旧引用无效,因此如果无法替换对旧数组的所有引用,则使用这些旧引用的代码将访问旧数组

但是,如果
array
是对特定数组的唯一引用,或者您的代码替换了所有现有引用,则理论上可以启用就地调整大小操作,而不是复制内容,另请参见

但是检查必要的前提条件可能比复制数组内容更昂贵。我能想象的唯一适用性场景是,如果数组是同一线程分配的最后一个对象,那么可以证明引用尚未逃逸,并且在分配空间中数组后面没有对象


对于具有这种优化功能的JVM,您可以在重复添加到时自动获得好处,因为该类确保它是其内部数组引用的唯一持有者,并在内部用于调整大小。

AFAIK,
realloc
分配一个新的内存块,并复制其中的内容,然后释放原始文件(尽管它声称如果其背后正好没有内存,那么它可能能够将其增长……这无疑是一种罕见的情况)
ArrayList可以做到这一点,但它是透明的(即,它会在需要时自动增长)。@john16384通过
System::arrayCopy
在内部复制阵列;但除此之外,我特别感兴趣的是扩展现有块的能力,而不是“复制它”。我在哪里可以找到这方面的证据@john16384你说“毫无疑问,这是一个罕见的案例”——你的依据是什么?也许这个问题应该被命名为“是否有可能在JVM堆中增加现有的分配”以更清楚地说明这一点。JVM可能在内部执行类似的操作,但从Java代码来看,您无法以任何方式控制这一点。您不能接受一个
字节[]
并要求一个更大的,您只能创建一个新的。