定义静态列表可能会导致内存泄漏?

时间:2013-07-26 13:52:59

标签: java memory-leaks static class-variables

如果我在班级中定义static变量,如下所示:

class MyClass
{
  private static List<String> list = new ArrayList<String>();
}

list会导致内存泄漏吗?如果是,那怎么办?

4 个答案:

答案 0 :(得分:2)

您发布的代码片段是内存泄漏,因为如果您从未清除该列表中的元素或将其设置为null,它将继续增长并且不会被垃圾收集。

使用非静态列表(实例或本地范围列表),这种情况发生得更少。对于非静态变量,一旦实例超出范围,变量(可能还有对象)也是如此,因此可以收集垃圾。使用静态变量时,它们永远不会超出范围(除非您将引用设置为null,这是final无法做到的),因为它们已链接到类。

答案 1 :(得分:1)

从技术上讲,只有当它超出garbage collector's范围时才会出现内存泄漏。另一方面,如果它在内存中延长了一段时间,即使你没有使用它,那么它就是logical flaw并且它将使相关对象也不会得到gc'ed。只有在卸载类时才会回收内存。

答案 2 :(得分:1)

不一定是静态列表(Collection)可能导致内存泄漏。如果我们有一个长寿的集合(例如缓存),我们应该以某种方式限制它的大小,例如通过从它中删除旧对象。

答案 3 :(得分:-1)

静态变量属于特殊内存中的类别,这意味着,在您的应用程序中只存在1个数组Myclass.list,而事实是它们不是动态的。因此,您的列表必须具有固定的大小。

public final  static String[] list=new String[]
    {"str1", //0
    "str2", //1
    "str3", //2
    "str4", //3
    };

您不能修改这些值,结果我怀疑它会导致泄漏。