我知道GC释放了不再引用的对象的内存,但是有没有一种有效的方法来检查我是否有对不再使用的对象的引用?
关于如何避免引用不再使用的对象的提示将受到极大的限制。
在这种情况下,是否正在使用Windows任务管理器的任何帮助?如果是这样,关于如何使用它批评我的程序的提示也会有所帮助。
感谢。
答案 0 :(得分:3)
检查很简单。您仍在使用您引用的所有对象。
“内存泄漏”的一个常见问题是将对象添加到集合中,并在不再需要时忘记清理它们。解决此问题的方法是使用WeakReferences或使用这些问题的集合,例如: WeakHashMap中。当其他地方不再有参考时,这些都会被清理干净。
恕我直言,Windows任务管理员更容易混淆而不是帮助。 ;)使用VIsualVM或商业内存分析器(如YourKit)是检查内存消耗的最佳方法。
答案 1 :(得分:1)
“不再使用”对象被垃圾收集。 “使用”意味着持有强大的参考。问题出在您不打算使用的对象上,但仍然被错误引用。
只有像VisualVM或JProfiler这样的Java分析器可以帮助您找到这些对象。
可以使用JProfiler显示如何查找内存泄漏的屏幕投射here。
免责声明:我公司开发JProfiler。
答案 2 :(得分:1)
你可能会发现文章What is a “Memory leak” in Java?很有用(我不知道在这里做广告的工具)。
我不知道如何找到引用但未使用的对象 - 但有时也可以对垃圾进行收集的对象会对您的程序产生影响 - 如果您创建大量的对象并经常引发GC。
要跟踪GC活动,您可以简单地使用java non standard option -Xloggc:<file>
。这会将GC活动记录到给定文件。您将首先了解应用程序在垃圾收集方面的繁忙程度。
我希望这对你有用,尽管我没有回答你的问题。