2011-01-09 70 views

回答

2

我非常怀疑这一点。内存泄漏,除非通过本机代码,实际上是内存膨胀的一种情况。内存膨胀只是具有强大引用的对象,从未被清除。

2

在Java中,您最终可能发生内存泄漏的唯一方法就是保留您不再需要的引用。由于您的应用程序仍然可以访问该引用,因此垃圾收集器将无法清除它,并且从垃圾收集器的角度来看,确实没有办法知道它是泄漏。

唯一要做的就是修复泄漏。至于如何找到并检测它们......我不幸没有很多建议。也许你可以在你的单元测试中添加代码来验证函数是否释放他们不再需要的内存?或者你可以运行你的单元测试,大大减少虚拟机的内存,以确定哪些单元负责最多的分配?有一些模式通常会导致泄漏。例如,保存一个较大字符串的子字符串(例如,如果您将文件读入一个字符串中),因为子字符串保留对它来自的字符串的引用。我想可以编写一个程序来检测这个和其他导致泄漏的常见模式。但是,我不知道有任何目前可用的程序可能会发生这种可能的泄漏检测。

1

除非您使用的是不寻常的JVM实现方式,否则仅当您坚持对象的时间超过所需时间时才会真正发生内存“泄漏”。如果Java检测到某个对象仍然可以访问,它将永远不会收集它,因为它可能会影响程序语义。

如果您有兴趣减少内存使用量,请尝试重新引用不再需要的对象的引用,或者使用WeakReferenceWeakHashMap来存储对象,以便可以自动回收对象。

如果您想尝试追查究竟是在内存中浪费的空间,您可能需要查看this paper通过查看对象访问来检测潜在的内存泄漏。这个工具显然工作得很好,虽然我不太熟悉它。

希望这会有所帮助!

0

jmap是你的朋友。在当前(sun/oracle)JVM中有一些泄漏,但我非常怀疑OP是在说什么。 终结器与幻影引用(impl by java.lang.ref.FinalReference;它们不会混淆它自己的GC,使finalize方法可用的对象有些不同)