【问题标题】:java static member memory leakjava静态成员内存泄漏
【发布时间】:2011-12-01 05:26:18
【问题描述】:
我正在审查一个 java 代码库以查找一些内存泄漏。在审查期间,我发现了以下情况。
- 代码库中有一个类 Class1。 Class1 有一些实例变量和一些静态成员。其他一些创建 Class1 实例的类。这种情况会导致任何内存泄漏吗?
- 代码库中可用的类 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,然后当程序崩溃时,使用分析工具对堆转储进行分析。
我能够找到有问题的变量/对象。希望对你有帮助,祝你好运!