如果我在班级中定义static
变量,如下所示:
class MyClass
{
private static List<String> list = new ArrayList<String>();
}
list
会导致内存泄漏吗?如果是,那怎么办?
答案 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
};
您不能修改这些值,结果我怀疑它会导致泄漏。