我一直在改变数组的维度。例如:
Window = new float[bufferSizeWords];
然后我使用相同的数组,但是使用两次
Window = new float[2*bufferSizeWords];
由于我没有明确控制垃圾收集,我是否有办法让这种使用内存更有效?介于Window=null
之间是否有任何帮助?
阵列非常大,导致旧款智能手机内存不足......
答案 0 :(得分:0)
如果您计划重复调整数组大小,则应使用ArrayList
。在构建它时,您仍然可以选择初始大小。如果超过初始容量,它将自动为您增加一倍。
答案 1 :(得分:0)
当我们增加数组的大小时,我们无法控制数组的位置,因为它的末尾旁边的内存可能被其他对象占用,所以需要将它重新定位到它可以适合的另一个空闲区域。这适用于ArrayList对象和本机数组。
如果没有找到这样的区域,gc肯定会在抛出OutOfMemoryError之前运行。也就是说,不需要显式调用gc来避免这样的错误。明确地调用gc很难成为IMO的好主意。
为了避免重新定位数组并且比请求连续的内存区域更灵活,最终可以构建自己的类来管理数组集合(即数组数组),每个块都是一些固定大小的数组,分配在需要时,在不再需要时释放(无效)。确保在不再需要时释放(nullify),以避免内存泄漏。