我正在检查一个用于查找内存泄漏的java代码库。在审查期间,我发现了以下情况。
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{ } }
有人可以给出答案吗?
答案 0 :(得分:3)
创建其他类的实例本身并不会造成内存泄漏。
持续超过需要的引用会造成内存泄漏。
这些引用可以是显式的或隐式的。例如:如果您创建非静态内部类的实例,那么它将保留对外部实例的引用,即使没有对该实例的显式引用也存在。
所以直接问题的答案是明确的:也许。您需要向我们提供更多信息。
并且:找到内存泄漏的一个很好的工具是使用分析器。特别是如果它是大内存泄漏。
答案 1 :(得分:1)
一般来说,静态成员在将它们设置为null之前不会被释放。如果实例本身无法访问,则将释放实例变量。 静态内部类就像普通类一样,因此遵守上面的规则。
非静态内在类由@Joachim Sauer描述。
P.S。学习使用分析器,它将为您的其余编程生活带来好处:)
答案 2 :(得分:1)
我遇到内存泄漏问题。一位同事推荐了一个内存分析工具http://www.eclipse.org/mat/。
我不是Java大师,甚至没有关闭。但我所做的是运行我的代码,监视程序何时崩溃(内存不足),然后我会再次运行代码,但这一次,使用命令行选项-Xmx
到我知道的数字会崩溃该计划。
我也添加了-XX:+HeapDumpOnOutOfMemoryError
,然后当程序崩溃时,使用了分析工具并分析了堆转储。
我能够找到有问题的变量/对象。希望有所帮助,祝你好运!