如何检测Eclipse RCP应用程序中的内存泄漏?
您可能需要尝试JRockit Mission Control与Eclipse MAT一起提供的Memory Leak Detector。这是一个强大的组合。这两种工具都可以免费用于开发。
使用JRockit Mission Control,您可以在线检查堆并查看实时特定类型的确切数量对象,而无需花费时间来拍摄快照。关闭视图/编辑器后,您可以直接查看堆上是否有编辑器,视图或侦听器对象。它通常是一个框架监听器,可以保存您的视图/编辑器。请记住,您必须转到Windows-> Preferences-> Memory Leak Detector-> Trend并将最低堆使用率设置为0.0以报告所有对象实例。
(来源:oracle.com)
使用MAT,您可以使用最短路径来查找根目录,以找到保留泄漏对象的链。见下文
alt text http://dev.eclipse.org/blogs/memoryanalyzer/files/2008/04/path2gc_all.png
修改代码并使用内存泄漏检测程序验证关闭编辑器/视图时对象是否为垃圾回收。
最简单的解决方案是Java JDK:Java VisualVM。
自JDK 6更新7以来,它位于bin目录(Windows下的jvisualvm.exe)中。
还包括内存分析器,堆walker和Eclipse integration。
https://visualvm.dev.java.net/images/getstarted/vvm-anagram-profiler.png(太糟糕了,我不允许使用图片标签)
如果你在Windows上,最简单的方法就是监控例如使用该工具时,任务管理器中的eclipse.exe进程。如果您的RCP可执行文件具有不同的名称,那么这就是您需要监视的内容。在Unix上你可以使用类似的工具(proc也许?)。
执行可用的最密集的任务(或者如果您怀疑某些功能导致问题,请使用这些任务)。如果在完成密集型任务后eclipse.exe使用的内存量最终没有减少,那么您可能会发生泄漏。这最终会导致内存不足错误。
您可以通过eclipse.ini(或.ini)中的“-Xmx”设置减少应用程序可用的内存量来加速内存不足错误。例如。 -Xmx256m表示最大256兆字节可用。显然,此设置仍然需要足以运行您的应用程序,但较低的设置将强制更频繁的垃圾收集并使泄漏更明显。
你需要一个内存分析器(正如其他人提到的那样)。一旦你有了一个好的工具,你就可以很容易地找到问题。
对于我们的测试,它运行良好,具有浮动许可证,因此开发人员可以在他们的机器上本地使用它。
基本上,您可以拍摄正在执行的操作的快照,然后查看已分配但未释放的项目。
编辑:我忘了添加,这个工具集成到了eclipse中。