Java:如何高效清空数组并在不同大小下重复使用?

3

我经常改变数组的维度。例如:

Window = new float[bufferSizeWords];

然后我使用同样的数组,但是长度加倍。

Window = new float[2*bufferSizeWords];

由于我没有显式控制垃圾回收,我有什么方法可以使这种使用内存更加高效?在其中使用Window=null会有任何帮助吗?

数组很大,在旧款智能手机上会导致内存不足异常...

2个回答

0
如果您计划重复调整数组大小,建议您使用 ArrayList。在构造时仍然可以选择初始大小。如果超出了初始容量,它会自动加倍。

我有简单的整数数组。我猜使用ArrayList处理可能不是很高效?我是对的吗? - user2064070
1
可能对您的使用情况来说很合适,而且出错的可能性要小得多。首先使其正确,然后再进行优化 :) - leeor

0

当我们增加数组的大小时,我们无法控制其位置,因为其末尾旁边的内存可能被其他对象占用,因此需要将其重新定位到另一个可以容纳它的空闲区域。这适用于ArrayList对象和本机数组。

如果找不到这样的区域,则gc在抛出OutOfMemoryError之前肯定会运行。也就是说,没有必要显式调用gc以避免此类错误。在我看来,显式调用gc很少是一个好主意。

为了避免重定位您的数组并比请求连续的内存区域更灵活,您最终可以构建自己的类来管理一组数组(即数组的数组),每个块都是一些固定大小的数组,在需要时分配并在不再需要时释放(置为空)。确保在不再需要时释放(置为空),以避免内存泄漏。


我曾经在某个地方读到,捕获内存不足错误实际上有助于内存效率 - 正是因为垃圾回收在异常发生之前就已经开始了。这是正确的吗? - user2064070
@user2064070 为什么会有帮助呢?因为唯一强制GC运行的方式是在实际发生内存错误时?这可能是某个人的观点,但老实说,我不明白捕获OutOfMemoryError如何能在任何方面提高性能。 - A.S.H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接