Java JVM数组是否可以是realloc()';D
因此,C语言有一个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并返回新指针。因此,如果您有指针的副本四处飞舞,您的职责就是用新指针替换所
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(长地址)
imkpublic float getXyz(长地址)
imkpublic void putXyz(长地址,xyz x)
array = Arrays.copyOf(array, newSize);
这不会使旧引用无效,因此如果无法替换对旧数组的所有引用,则使用这些旧引用的代码将访问旧数组
但是,如果array
是对特定数组的唯一引用,或者您的代码替换了所有现有引用,则理论上可以启用就地调整大小操作,而不是复制内容,另请参见
但是检查必要的前提条件可能比复制数组内容更昂贵。我能想象的唯一适用性场景是,如果数组是同一线程分配的最后一个对象,那么可以证明引用尚未逃逸,并且在分配空间中数组后面没有对象
对于具有这种优化功能的JVM,您可以在重复添加到时自动获得好处,因为该类确保它是其内部数组引用的唯一持有者,并在内部用于调整大小。首先,C函数
realloc
不是一个可以增加数组的工具,而是,以前的记忆。相比之下,C数组可以驻留在堆栈或静态内存区域上,甚至可以嵌入到更大的结构中
然后,该函数具有使原始指针无效的语义,如free
does并返回新指针。因此,如果您有指针的副本四处飞舞,您的职责就是用新指针替换所有出现的内容
当然,Java不支持使引用无效。保证每个非空对象引用的有效性是Java内存管理的基本属性
因此,如果您想要与C的realloc等价,那么必须使用指针而不是数组。然后sun.misc.Unsafe
执行所有相关操作
公共长分配器内存(长字节)
公共长reallocatemory(长地址,长字节)
public void freemory(长地址)
imkpublic float getXyz(长地址)
imkpublic void putXyz(长地址,xyz x)
array = Arrays.copyOf(array, newSize);
这不会使旧引用无效,因此如果无法替换对旧数组的所有引用,则使用这些旧引用的代码将访问旧数组
但是,如果array
是对特定数组的唯一引用,或者您的代码替换了所有现有引用,则理论上可以启用就地调整大小操作,而不是复制内容,另请参见
但是检查必要的前提条件可能比复制数组内容更昂贵。我能想象的唯一适用性场景是,如果数组是同一线程分配的最后一个对象,那么可以证明引用尚未逃逸,并且在分配空间中数组后面没有对象
对于具有这种优化功能的JVM,您可以在重复添加到时自动获得好处,因为该类确保它是其内部数组引用的唯一持有者,并在内部用于调整大小。AFAIK,
realloc
分配一个新的内存块,并复制其中的内容,然后释放原始文件(尽管它声称如果其背后正好没有内存,那么它可能能够将其增长……这无疑是一种罕见的情况)ArrayList可以做到这一点,但它是透明的(即,它会在需要时自动增长)。@john16384通过System::arrayCopy
在内部复制阵列;但除此之外,我特别感兴趣的是扩展现有块的能力,而不是“复制它”。我在哪里可以找到这方面的证据@john16384你说“毫无疑问,这是一个罕见的案例”——你的依据是什么?也许这个问题应该被命名为“是否有可能在JVM堆中增加现有的分配”以更清楚地说明这一点。JVM可能在内部执行类似的操作,但从Java代码来看,您无法以任何方式控制这一点。您不能接受一个字节[]
并要求一个更大的,您只能创建一个新的。