如果我static
在我的类中定义一个变量,如下所示:
class MyClass
{
private static List<String> list = new ArrayList<String>();
}
list
会导致内存泄漏吗?如果是,那么如何?
如果我static
在我的类中定义一个变量,如下所示:
class MyClass
{
private static List<String> list = new ArrayList<String>();
}
list
会导致内存泄漏吗?如果是,那么如何?
您发布的代码片段是内存泄漏,如果您从未从该列表中清除元素或将其设置为null
,它将继续增长并且不会被垃圾收集。
对于非静态列表(实例或本地范围列表),这种情况发生的频率要低得多。对于非静态变量,一旦实例超出范围,变量(可能还有对象)也会超出范围,因此它可以被垃圾收集。使用静态变量,它们永远不会超出范围(除非您将引用设置为null
,您不能在 上执行此操作final
),因为它们已链接到类。
garbage collector's
从技术上讲,只有当它无法触及时,它才是内存泄漏。另一方面,如果它在内存中长时间存在,即使您没有使用它,那也是如此logical flaw
,它也会阻止相关对象被 gc'ed。只有在卸载类时才会回收内存。
可能导致内存泄漏的不一定是静态列表(集合)。如果我们有一个长期存在的集合(例如缓存),我们应该以某种方式限制它的大小,例如通过从其中删除旧对象。
静态变量位于分配在特殊内存位置的类中,这意味着您的应用程序中仅存在 1 个数组Myclass.list
,而且它们不是动态的。所以你的列表必须有一个固定的大小。
public final static String[] list=new String[]
{"str1", //0
"str2", //1
"str3", //2
"str4", //3
};
你不能修改这些值,结果我怀疑它会导致泄漏。