2

如果我static在我的类中定义一个变量,如下所示:

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

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

4

4 回答 4

2

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

对于非静态列表(实例或本地范围列表),这种情况发生的频率要低得多。对于非静态变量,一旦实例超出范围,变量(可能还有对象)也会超出范围,因此它可以被垃圾收集。使用静态变量,它们永远不会超出范围(除非您将引用设置为null,您不能在 上执行此操作final),因为它们已链接到类。

于 2013-07-27T14:33:05.563 回答
1

garbage collector's从技术上讲,只有当它无法触及时,它才是内存泄漏。另一方面,如果它在内存中长时间存在,即使您没有使用它,那也是如此logical flaw,它也会阻止相关对象被 gc'ed。只有在卸载类时才会回收内存。

于 2013-07-26T14:02:22.130 回答
1

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

于 2013-07-26T14:15:45.160 回答
-1

静态变量位于分配在特殊内存位置的类中,这意味着您的应用程序中仅存在 1 个数组Myclass.list,而且它们不是动态的。所以你的列表必须有一个固定的大小。

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

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

于 2013-07-26T13:57:31.953 回答