【问题标题】:Defining a static List could lead to memory leakage?定义静态列表会导致内存泄漏?
【发布时间】:2013-07-26 19:57:42
【问题描述】:

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

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

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

【问题讨论】:

  • 问你一个问题。为什么是静态的?
  • @AndrewThompson 我刚刚遇到stackoverflow.com/a/6548647 的回答。第一点是告诉它可能导致内存泄漏。但我无法理解。所以我在这里问。
  • @Mac 如果列表不断增长,您将保留对您可能不需要的对象的引用,并且它们不会被垃圾收集。从这个意义上说,这是一个内存泄漏。您仍然可以通过清除列表来修复它。
  • @SotiriosDelimanolis 但无论您指定什么原因,也可以使用非静态列表来实现..
  • @Mac 这发生的频率要低得多。对于非静态变量,一旦实例超出范围,列表也会如此,因此它可以被垃圾收集。使用静态变量,它们永远不会超出范围(除非你 null 它,你不能在 final 上这样做),因为它们链接到类。

标签: java memory-leaks static class-variables


【解决方案1】:

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

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

【讨论】:

  • 感谢您的澄清 :)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-10-30
        • 2011-02-15
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 2021-03-23
        • 2021-09-25
        • 2014-12-08
        • 1970-01-01
        相关资源
        最近更新 更多