java静态成员内存泄漏

时间:2011-10-05 06:22:00

标签: java memory static memory-leaks members

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

  1. Class1中有一个类Class1。 Class1有一些实例变量和一些静态成员。其他一些类创建Class1的实例。这种情况会导致内存泄漏吗?
  2. 代码库中可用的Class2类。它有一些公共静态内部类。静态内部类的实例是从其他静态内部类创建的。它会导致内存泄漏吗?例如,
  3. 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{
      }
    
    }
    

    有人可以给出答案吗?

3 个答案:

答案 0 :(得分:3)

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

持续超过需要的引用会造成内存泄漏。

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

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

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

答案 1 :(得分:1)

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

非静态内在类由@Joachim Sauer描述。

P.S。学习使用分析器,它将为您的其余编程生活带来好处:)

答案 2 :(得分:1)

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

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

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

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