当前位置: 首页 > 知识库问答 >
问题:

JVM数组可以realloc()d吗?

齐英朗
2023-03-14

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

对于JVM/Java是否存在等价的概念?是否用于arrays或nio.buffers?我不介意这是JDK的一部分还是作为外部库,例如sun.unsafe

共有1个答案

养聪
2023-03-14

首先,C函数realloc不是一个可以增长数组的工具,而是以前通过malloccallocrealloc分配的内存。相反,C数组可能驻留在堆栈或静态存储器区域上,甚至可能嵌入到更大的结构中。

然后,该函数具有像free那样使原始指针无效并返回新指针的语义。因此,如果你有指针的副本到处乱飞,你有责任用新的指针替换所有出现的东西。

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

  • Public long allocateMemory(长字节)
  • Public long reallocateMemory(长地址、长字节)
  • public void freeMemory(长地址)
  • 公共浮点getXyz(长地址)
  • 公共无效putXyz(长地址,xyz x)

其中“XYZ”代表原始类型

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

array = Arrays.copyOf(array, newSize);

但是,如果array是对特定数组的唯一引用,或者您的代码显然替换了所有现有引用,那么理论上,JVM可能启用就地调整大小操作,而不是复制内容,请参见运行JDK代码时Java JIT作弊吗?

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

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

 类似资料:
  • 从参考资料中,我发现: 类模板std::function是一个通用多态函数包装器。函数的实例可以存储、复制和调用任何可调用的目标函数、lambda表达式、绑定表达式或其他函数对象,以及指向成员函数的指针和指向数据成员的指针。 我不明白为什么应该能够存储这样的指针,而且我以前从未听说过这个功能。 真的有可能吗,我错过了什么或者是留档中的错误? 在这种情况下,

  • 描述 (Description) C库函数void *realloc(void *ptr, size_t size)尝试调整先前通过调用malloc或calloc分配的ptr指向的内存块。 声明 (Declaration) 以下是realloc()函数的声明。 void *realloc(void *ptr, size_t size) 参数 (Parameters) ptr - 这是指向先前分配

  • 例如,我们有一个数组: 现在我想创建d=5的数组的最大数量: array1: array2:

  • 问题内容: 如果HashMap的键是字符串数组: 你可以使用新创建的字符串数组访问地图,还是必须是相同的String []对象? 问题答案: 它必须是同一对象。使用和的比较键只有在两个对象相同时才相等。 如果你想要的值相等,然后写一个包装了自己的容器类,并提供了相应的语义和。在这种情况下,最好使容器不可变,因为更改对象的哈希码会对基于哈希的容器类造成破坏。 编辑 正如其他人指出的那样,List 具

  • 以下是我目前掌握的情况: 其中,我有一行,它应该取索引处的数组的值,并将其转换为长度为5的数组。因此,如果,它应该创建一个长度为5的数组。但是,它会抛出一个非法的表达式开始错误。 我也尝试使用临时变量来帮助声明多个数组,但是我得到了更多的错误以及表达式的非法开始。 有没有什么方法可以在不使用多维数组的情况下解决这个问题呢? 提前道谢。

  • 问题内容: 我运行,其中返回的列表,即和: 是一个二维数组,在底部具有旋转的零线(即使在我的测试集中的所有示例中都得到了证明): 。现在,我想分为两个矩阵: 和: (提取所有零线)。似乎接近此解决方案:删除numpy array中的行 。 编辑: 更加有趣:返回-matrix。不,我期望的是: 问题答案: 使用带有参数: