Java:如何有效地清理数组并以不同的大小重用它?

时间:2015-10-11 04:21:00

标签: java arrays

我一直在改变数组的维度。例如:

Window = new float[bufferSizeWords];

然后我使用相同的数组,但是使用两次

Window = new float[2*bufferSizeWords];

由于我没有明确控制垃圾收集,我是否有办法让这种使用内存更有效?介于Window=null之间是否有任何帮助?

阵列非常大,导致旧款智能手机内存不足......

2 个答案:

答案 0 :(得分:0)

如果您计划重复调整数组大小,则应使用ArrayList。在构建它时,您仍然可以选择初始大小。如果超过初始容量,它将自动为您增加一倍。

答案 1 :(得分:0)

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

如果没有找到这样的区域,gc肯定会在抛出OutOfMemoryError之前运行。也就是说,不需要显式调用gc来避免这样的错误。明确地调用gc很难成为IMO的好主意。

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