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

卢西亚诺

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

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

霍尔格

首先,C函数realloc是不是一个工具,它可以成长阵列,而是记忆先前通过分配malloccallocrealloc相反,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在理论上可以启用就地调整大小操作而不是复制内容,请参见运行JDK代码时Java JIT是否作弊?

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章