1

我正在审查一个 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{
  }

}

有人可以给出答案吗?

4

3 回答 3

3

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

持有比需要更长的引用会造成内存泄漏。

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

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

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

于 2011-10-05T07:14:23.573 回答
1

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

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

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

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

于 2012-07-17T08:13:34.363 回答
1

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

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

ps 学习使用分析器,它将在您的余下编程生涯中受益 :)

于 2011-10-05T07:21:52.343 回答