Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在arraylist中添加元素时发生java.lang.OutOfMemoryError_Java_Android_Arraylist_Out Of Memory - Fatal编程技术网

在arraylist中添加元素时发生java.lang.OutOfMemoryError

在arraylist中添加元素时发生java.lang.OutOfMemoryError,java,android,arraylist,out-of-memory,Java,Android,Arraylist,Out Of Memory,从设备读取文件名并将其添加到ArrayList中,以处理相同的文件名,但添加ArrayList引发异常的方法 Fatal Exception: java.lang.OutOfMemoryError: Failed to allocate a 55380616 byte allocation with 25165824 free bytes and 25MB until OOM, max allowed footprint 534834552, growth limit 536870912

从设备读取文件名并将其添加到ArrayList中,以处理相同的文件名,但添加ArrayList引发异常的方法

Fatal Exception: java.lang.OutOfMemoryError: Failed to allocate a 55380616 byte allocation with 25165824 free bytes and 25MB until OOM, max allowed footprint 534834552, growth limit 536870912
       at java.util.Arrays.copyOf + 3139(Arrays.java:3139)
       at java.util.Arrays.copyOf + 3109(Arrays.java:3109)
       at java.util.ArrayList.grow + 275(ArrayList.java:275)
       at java.util.ArrayList.ensureExplicitCapacity + 249(ArrayList.java:249)
       at java.util.ArrayList.ensureCapacityInternal + 241(ArrayList.java:241)
       at java.util.ArrayList.add + 467(ArrayList.java:467)

专用静态void加载文件(个文件){
试一试{
如果(!canAddTheseFiles)){
返回;
}
文件myDirectoryFiles[]=s.listFiles();

对于(int i=0;currentDirectoryFiles!=null&&i每次在for循环中,您都会向列表中添加一个新元素。您一直保留在列表中的此文件名的大小对于所有文件名来说都比堆大小大,这就是为什么您会一直添加元素,直到堆空间用完。

ArrayList包含hoo下的数组d、 数组==连续(无孔)内存块。当内存块很大时(分配失败的原因…),几乎不可能获取它在这种情况下,你可以试试LinkedList。

很容易耗尽你正在做的事情,比如你正在做的事情——你应该考虑在使用它时只加载列表的一个子集。

但我在上面看到的问题是对ArrayList如何工作的误解——随着它的增长,您使用的内存是您认为的(暂时)内存的两倍:

使用
new ArrayList()
正在生成
new String[10]
。因此,您添加的前十个项目将直接进入备份数组。现在,当您到达第十一个项目时,ArrayList会自动增长,如StackTrace所示

它不能仅仅通过扩展一个数组来实现这一点,相反,它会创建一个全新的数组,它的大小是原来的两倍,并将所有内容复制到另一个数组中。因此,突然之间,你有一段时间有了
新字符串[10]+新字符串[20]
。一旦你到达第二十项,它会将其再次加倍(依此类推)

如果您在某一点上有数千个项目,那么当它跨多个项目进行复制时,您可能会得到(例如)
newstring[20000]+newstring[40000]

如果你知道你的列表中已经有多少项,你可以把列表扩大到足够大

例如,如果你认为你将达到2345项,那么你可以从

new ArrayList(2400);

现在,它不会有任何增长,您只需担心有足够的空间容纳所有实际的字符串

似乎您正在向列表中添加这么多名称(或在其他地方执行某些操作)您正在超出分配的堆。您需要增加它或尝试使用streams。请在清单文件中使用android:largeheap=true首先从循环中删除
currentDirectoryFiles!=null
。只需在外部检查一次。同时提供代码您如何调用此方法和方法
canAddTheseFiles
。没有办法名为的ArrayList最多可以填充
55380616字节
。@JawadAhmed**largeheap=true**manifest@ADM仅当指定的目录尚未读取时,我才调用此方法。其次,每当我创建新文件时,我也会将该名称添加到此ArrayList中,并在该行上引发相同的异常。
canAddTheseFiles
方法补充感谢你的评论,我用另一种方法解决了它。然后你应该在这里发布你的答案供未来的用户使用,回答你自己的问题很好。你为什么否决投票?