【问题标题】:java static member memory leakjava静态成员内存泄漏
【发布时间】:2011-12-01 05:26:18
【问题描述】:

我正在审查一个 java 代码库以查找一些内存泄漏。在审查期间,我发现了以下情况。

  1. 代码库中有一个类 Class1。 Class1 有一些实例变量和一些静态成员。其他一些创建 Class1 实例的类。这种情况会导致任何内存泄漏吗?
  2. 代码库中可用的类 Class2。它有一些公共静态内部类。静态内部类的实例是从其他静态内部类创建的。它会导致内存泄漏吗?例如,
Class2 {
  public static class Class3 {
  }
  public static class Class4 {
  }
  public static class Class3 {
      Class3 c = new Class3();
      //….
  }
  public static int doSomething1{
  }
  public static void doSomething2{
  }
  public void doSomething3{
  }

}

有人可以回答吗?

【问题讨论】:

    标签: java memory static memory-leaks members


    【解决方案1】:

    创建其他类的实例本身不会造成内存泄漏。

    保持引用超过需要的时间会导致内存泄漏。

    这些引用可以是显式的或隐式的。例如:如果您创建一个非静态内部类的实例,那么它将保留对外部实例的引用,即使不存在对该外部实例的显式引用。

    所以你的直接问题的答案是肯定的:也许。您需要向我们提供更多信息。

    而且:发现内存泄漏的一个很好的工具是使用分析器。特别是如果它是一个 内存泄漏。

    【讨论】:

      【解决方案2】:

      一般来说,静态成员是不会被释放的,除非你把它们设置为null。如果实例本身不可访问,实例变量将被释放。 静态内部类就像一个普通的类,因此遵守上面的规则。

      非静态内部类如@Joachim Sauer 所述。

      附言学习使用分析器,它将在您的余生中受益:)

      【讨论】:

        【解决方案3】:

        我遇到了内存泄漏问题。一位同事推荐了一个内存分析工具http://www.eclipse.org/mat/

        我不是 java 大师,甚至都不是。但是我所做的是运行我的代码,监视程序何时崩溃(内存不足),然后我会再次运行代码,但这一次,使用命令行选项-Xmx 到一个我知道会使程序崩溃的数字.

        我也添加了-XX:+HeapDumpOnOutOfMemoryError,然后当程序崩溃时,使用分析工具对堆转储进行分析。

        我能够找到有问题的变量/对象。希望对你有帮助,祝你好运!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-08
          • 1970-01-01
          • 2012-10-12
          • 2012-08-08
          相关资源
          最近更新 更多