为什么ArrayList.clear()方法不释放内存?

时间:2015-11-20 14:29:29

标签: java optimization arraylist memory-leaks garbage-collection

我正在研究ArrayList.clear()&发现它没有释放内存而是使该列表为空。 你为什么要等待GC的到来?当你可以手动告诉编译器不再需要这个特定的ArrayList时,释放那个内存(它可以在clear方法本身完成)。!!

为什么你想让GC不必要地头疼呢。

我知道System.gc()会影响应用程序的性能,因为它会为整个应用程序运行垃圾收集。

有没有办法收集这个特定的ArrayList垃圾,而不是在我的服务器内存有限的情况下等待GC来救援。列表大小太大了。

编辑: - 出现这个问题的原因是我初始化了一个ArrayList(500000)&假设我的对象大小大约是1000字节由于一些预先初始化的变量,但由于形成第一个对象本身的一些例外,我需要从该函数返回,释放我已经分配给该ArrayList的内存。我希望我的应用程序消耗它可以像记忆一样低。 GC是我的最后选择。

2 个答案:

答案 0 :(得分:4)

  

你为什么要等待GC出现?释放那个记忆(它可以用明确的方法本身完成)

不,它不能。 ArrayList确实不再引用对象,但clear()方法不知道它们是否仍在其他地方被引用,这就是为什么这是垃圾收集器的工作。

答案 1 :(得分:2)

  

你为什么要等待GC出现?释放那种记忆(它可以   已经完成了明确的方法)

上面的句子中存在很大的误解:所有内存都被Java中的GC释放,无法手动释放堆上对象占用的内存。

但是为了回答为什么clear()将所有元素归零而不是仅丢弃旧的支持数组的问题,简单的答案就是"因为它是以这样的方式编写的#34;。

稍微长一点的答案是,您通常在使用新元素重新填充列表之前使用clear(),因此丢弃旧数组并分配一个新数组(然后可能需要多次重新分配才能到达与早期支持阵列相同的大小)被认为太浪费了。

如果另一方面你想要摆脱ArrayList的好处,你就不需要在它上面调用clear(),你只需要对列表本身的任何引用都是空的