【问题标题】:Memory leak in Java. How to clear list?Java中的内存泄漏。如何清除列表?
【发布时间】:2012-11-23 05:49:19
【问题描述】:

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

【问题讨论】:

  • 请提供代码...它来自 Java 集合类吗?
  • 您是如何发现内存泄漏的?你是如何检查 'list.clear()' 或 'list=null' 没有效果的?
  • 那么泄漏的原因可能不同
  • 请解释一下您是如何知道内存泄漏来自列表的...请使用一些分析工具找出真正的罪魁祸首。 en.wikipedia.org/wiki/List_of_performance_analysis_tools#Java试试jprofiler,我试过的时候很有用
  • @ntalbs 我使用了显示泄漏嫌疑的 mat 作为实现用于处理指示的侦听器的类之一。我从 jvm 控制台检查了内存使用情况,有无 list.clear() 具有几乎相同的值。

标签: java memory-leaks jvm


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您想清除列表,只需致电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。如果您希望对列表中的对象进行垃圾回收,则必须确保它们不再在任何地方被引用。

    【讨论】:

    • { Foo a = new Foo(1.0); Foo b = new Foo(2.0); { List foo = new ArrayList(); foo.add(a); foo.add(b); } list.removeAll();} 如果此后不使用 foo 会起作用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2019-05-22
    • 2012-08-07
    • 2015-10-14
    • 2021-07-13
    相关资源
    最近更新 更多