gpt4 book ai didi

java - Java Collection 的removeAll(Collection c) 方法是否强制对c 的元素进行垃圾回收?

转载 作者:太空宇宙 更新时间:2023-11-04 08:47:01 25 4
gpt4 key购买 nike

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

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

预先感谢您提供任何有用的建议。

最佳答案

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

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

听起来您限制第二个数组大小的策略可以帮助减少可到达对象的工作集。另一种可能性是使用 ArrayList.set(pos, null) 来清空第一个列表中不再需要的条目。不幸的是,您的问题中没有足够的详细信息来提供更多帮助。

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

关于java - Java Collection 的removeAll(Collection c) 方法是否强制对c 的元素进行垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4111322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com