Java:在List上调用clear()会立即释放内存吗?

时间:2010-11-06 19:31:02

标签: java performance

哪会更快地清理内存:

鉴于我们有一个链表,在本例中是ArrayList,但随意为其他列表解释:

ArrayList<String> list = ...10000 elements

A)

list.clear();
System.gc();

或B)

list = null;
System.gc();

4 个答案:

答案 0 :(得分:6)

不,它不会立即释放内存。你不能这样做。

垃圾收集器运行后,内存将被释放。但你不能强迫它运行。您只能向JVM建议应该运行垃圾收集器,但绝不会强制这样做。

答案 1 :(得分:2)

他们中的任何一个都不能保证释放内存,除非你能证明这些是你试图释放的资源的唯一参考。

其中任何一个都应该有效,在B的情况下释放一个额外的对象(列表本身)。

答案 2 :(得分:1)

如果使用weakhashmap,键在列表中,你会发现list.clear更好

答案 3 :(得分:0)

here上有一个关于Java List行为和列表备选方案的一般性写法:

虽然我没有深入研究源代码,但在我看来,JDK 7版本的数组列表是基于可调整大小的数组而不是链接列表。当您调用clear时,该对象仍保留其缓冲区的一部分。

如果将对象设置为null,则整个列表都有资格进行收集(假设没有其他对象保留对它的引用)。