gpt4 book ai didi

java - JVM 数组可以被 realloc() 吗?

转载 作者:行者123 更新时间:2023-12-02 01:29:40 24 4
gpt4 key购买 nike

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

JVM/Java 是否存在等效概念?对于Array还是nio.Buffer?我不介意这是 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(长地址,长字节)
  • public void freeMemory(长地址)
  • public float getXyz(长地址)1
  • public void putXyz(长地址, xyz x)1

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

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

array = Arrays.copyOf(array, newSize);

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

但是,如果 array 是对特定数组的唯一引用,或者您的代码确实替换了所有现有引用,则 JVM理论上可以启用就地调整大小操作而不是复制内容,另请参阅 Does Java JIT cheat when running JDK code?

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

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

关于java - JVM 数组可以被 realloc() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56306057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com