Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.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
Java集合';s removeAll(Collection c)方法强制对c的元素进行垃圾收集?_Java_Garbage Collection - Fatal编程技术网

Java集合';s removeAll(Collection c)方法强制对c的元素进行垃圾收集?

Java集合';s removeAll(Collection c)方法强制对c的元素进行垃圾收集?,java,garbage-collection,Java,Garbage Collection,我编写了一个Java程序,它构建了一个巨大的arraylist(包含700多万个元素)。然后迭代该arraylist的元素,我正在构建第二个arraylist,它的大小也类似于以百万为单位。在迭代过程中的某个时刻,我遇到了超出GC开销限制的内存不足异常 我想到了一个解决方案,比如每当第二个arraylist的大小达到10000时,我就会将其元素保存到文件或数据库表中,并在该arraylist上调用removeall()。 但这个调用会强制对元素进行垃圾收集吗?如果没有,那么我的问题仍然没有解决

我编写了一个Java程序,它构建了一个巨大的arraylist(包含700多万个元素)。然后迭代该arraylist的元素,我正在构建第二个arraylist,它的大小也类似于以百万为单位。在迭代过程中的某个时刻,我遇到了超出GC开销限制的内存不足异常

我想到了一个解决方案,比如每当第二个arraylist的大小达到10000时,我就会将其元素保存到文件或数据库表中,并在该arraylist上调用removeall()。 但这个调用会强制对元素进行垃圾收集吗?如果没有,那么我的问题仍然没有解决


提前感谢您提供的有用建议。

仅当列表中对象的所有引用被删除时。

仅当列表中对象的所有引用被删除时。

调用
removeAll
不会触发垃圾收集,手动触发垃圾收集也不会有帮助。让垃圾收集按要求进行。(您可以确保它将在应用程序获得OOME之前运行。只有在运行完整GC后空间不足时才会抛出OOME。)

您需要做的是减少可访问对象的数量和大小。这意味着当垃圾收集运行时,它将回收更多的垃圾,并且您的应用程序将能够继续

听起来,您限制第二个数组大小的策略可以通过减少可访问对象的工作集来有所帮助。另一种可能是使用
ArrayList.set(pos,null)
将第一个列表中不再需要的条目设置为null。不幸的是,您的问题中没有足够的细节来提供更多帮助


或者,只需增加JVM的最大堆大小。

调用
removeAll
不会触发垃圾收集,手动触发垃圾收集也不会有帮助。让垃圾收集按要求进行。(您可以确保它将在应用程序获得OOME之前运行。只有在运行完整GC后空间不足时才会抛出OOME。)

您需要做的是减少可访问对象的数量和大小。这意味着当垃圾收集运行时,它将回收更多的垃圾,并且您的应用程序将能够继续

听起来,您限制第二个数组大小的策略可以通过减少可访问对象的工作集来有所帮助。另一种可能是使用
ArrayList.set(pos,null)
将第一个列表中不再需要的条目设置为null。不幸的是,您的问题中没有足够的细节来提供更多帮助


或者,只需增加JVM的最大堆大小。

垃圾收集器将根据需要自动运行。您可以通过
System.gc()
手动调用它,但这对您的情况没有帮助

下面有一个例子解释了错误的含义,特别是如何禁用它:

如果在垃圾收集中花费的时间太多,并行/并发收集器将抛出OutOfMemoryError:如果在垃圾收集中花费的时间超过了总时间的98%,并且恢复的堆少于2%,则将抛出OutOfMemoryError。此功能旨在防止应用程序在运行较长时间的同时由于堆太小而进展甚微或毫无进展。如有必要,可通过在命令行中添加选项-XX:-usegcoveredlimit来禁用此功能


垃圾收集器将根据需要自动运行。您可以通过
System.gc()
手动调用它,但这对您的情况没有帮助

下面有一个例子解释了错误的含义,特别是如何禁用它:

如果在垃圾收集中花费的时间太多,并行/并发收集器将抛出OutOfMemoryError:如果在垃圾收集中花费的时间超过了总时间的98%,并且恢复的堆少于2%,则将抛出OutOfMemoryError。此功能旨在防止应用程序在运行较长时间的同时由于堆太小而进展甚微或毫无进展。如有必要,可通过在命令行中添加选项-XX:-usegcoveredlimit来禁用此功能


简单的答案是将内存加倍,这样程序就可以在不崩溃的情况下完成。复杂的答案是改进您的算法,这样您就不需要同时在内存中存储那么多东西。简单的答案是将内存翻一番,这样您的程序就可以在不崩溃的情况下完成。复杂的答案是改进您的算法,这样您就不需要同时在内存中存储这么多东西。