2011-10-05 98 views
1

我正在审查一个用于查找内存泄漏的java代码库。在审查过程中,我发现了以下情况。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{ 
    } 

} 

有人可以给出答案?

回答

3

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

坚持引用超过需要会导致内存泄漏。

那些引用可以是显式的也可以是隐式的。例如:如果你创建了一个非静态内部类的实例,那么它将保持对外部实例的引用,即使没有明确的引用存在。

所以你的直接问题的答案是确定的:也许。你需要给我们更多的信息。

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

1

一般来说,静态成员将不会被释放,直到您将它们设置为空。如果实例本身不可访问,则实例变量将被释放。 静态内部类与普通类相似,因此遵守上述规则。

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

p.s.学习使用一个分析器,它会使您的编程生涯的其余部分受益:)

1

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

我不是java大师,甚至没有关闭。但是我所做的就是运行我的代码,监视程序何时会崩溃(内存不足),然后再次运行代码,但是这次使用命令行选项-Xmx来知道会导致程序崩溃。

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

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