Java中的内存泄漏。如何清除清单?

时间:2012-11-23 05:49:19

标签: java memory-leaks jvm

我在源代码中找到了一些列表,其中包含list.add()但不是list.remove()。它是否导致内存泄漏?我尝试了list.clear()list=null,但似乎没有效果。 应该怎么做才能清除这个清单?请妥善解释......先谢谢。

2 个答案:

答案 0 :(得分:2)

list.clear()将清除列表中的所有引用。如果它们未被任何其他对象使用,它将由garbage collector从内存中清除。但clear单独不会delete对象。我认为问题是,其他一些对象正在使用数据,所以它仍然存在于内存中。

发布示例代码,让我们知道确切的问题是什么。

答案 1 :(得分:1)

如果要清除列表,只需拨打List.removeAll即可。在对象被引用到某个地方之前,它们没有资格被垃圾收集,因此如果List.removeAll没有效果,则意味着列表中的对象仍然被引用到其他地方,例如在另一个集合或类中。

您如何知道List.clear / List.removeAll无效?不必删除手动添加到列表中的每个元素。列表可能超出范围,因此被丢弃。

{ 
    Foo a = new Foo(1.0);
    Foo b = new Foo(2.0);
    {
        List<Foo> foo = new ArrayList<Foo>();
        foo.add(a); foo.add(b);
    } // scope ends for foo, remove was not called but still
      // the list is discarded, and the reference it holds to a and b too
}

因此,要清除列表,只需致电List.removeAll即可。如果您希望对列表中的对象进行垃圾回收,则必须确保它们不再被引用。