4

有没有人使用 Eclipse 内存管理器来检测 java 代码中的内存泄漏?任何人都可以推荐一个寻找有关使用内存管理器信息的好地方吗?我在网上阅读了一些东西,它表明我需要让程序运行直到它崩溃(发生内存不足错误),这将生成一个崩溃报告。然后使用内存管理器打开此报告以检查可能发生内存泄漏的位置。这是每个人都使用内存管理器的方式吗?

4

6 回答 6

2

也许最简单的事情是在HProf(作为 JVM 的标准配置)下运行您的程序一段时间,然后强制退出。HProf 的输出应该希望能给你一些直接的指针。你的内存泄漏。

与 Eclipse 内存调试器(我仅从您编写的内容中了解)不同,您可以从执行的任何点收集统计信息。

于 2009-10-28T15:34:15.077 回答
2

它表明我需要让程序运行直到它崩溃(发生内存不足错误),这将生成崩溃报告。

我不认为这是真的——当一个OutOfMemoryError发生时你不会得到一个转储文件(我敢打赌作者把这个问题与某种会导致核心转储保存的 JVM 错误混淆了)。

最好的方法是使用jmap进行堆转储;这会将堆的内容输出到二进制文件(通常称为 hprof 文件)。然后可以由任意数量的分析器分析此文件:

  • jhat - 分析 hprof 文件的 Sun 工具,启动嵌入式 Web 服务器,因此您可以通过 Web 浏览器分析堆/查看报告。我发现这对于大堆来说非常慢。
  • VisualVM - 与 JDK 捆绑在一起的很棒的调试/故障排除工具。除此之外,这还可用于生成任何正在运行的进程的堆转储以及线程转储。我发现加载大型 hprof 文件也很慢。
  • Eclipse Memory Analyzer - 可以生成 hprof 文件的 Eclipse 插件。

我强烈建议使用 Eclipse 插件,因为它可以非常快速地加载大型(> 500MB)堆转储(在一分钟内),生成有用的报告,支持具有复杂逻辑的查询语言等。

于 2009-10-28T16:18:28.810 回答
2

虽然-XX:+HeapDumpOnOutOfMemoryError可能很有用,但我当前使用 Eclipse 内存管理器的工作流程是:

  1. 正常运行程序
  2. 等待记忆失控。
  3. 运行jmapjmap -dump:format=b,file=dump.hprof <PID>
  4. 在 EMM 中打开 hprof 文件。

我通常开始使用直方图和支配树视图来查看是否有任何异常,然后从那里向下钻取。

VisualVM 很有用,但在处理堆转储时似乎比 EMM 效率低得多(EMM 在加载堆转储时缓存了大量信息)。Netbeans Profiler 非常适合获取分配位置和时间分析。

于 2009-10-28T16:28:06.153 回答
1

本页介绍了使用 jvm 堆转储。Jhat 是一种更简单的处理堆的图形化方式,但您也可以将相同的转储文件加载到 eclipse 内存管理器中。如果您使用的是当前(1.6)jvm,您还可以从 jvisualvm 获取一些信息。

于 2009-10-28T15:36:45.787 回答
0

我通常更喜欢使用 NetBeans Profiler 分析应用程序。在大多数情况下,您可以很容易地看到哪些对象正在泄漏以及它们是在哪里创建的。可能还有其他几个工具也可以执行此操作,但我知道 NetBeans 分析器运行良好,并且易于使用。

于 2009-10-28T16:25:49.417 回答
0

您可以尝试使用Jprobe。您可以监控您的应用程序,并可以在创建对象时查看它们。这也将有助于分析哪些对象不会被垃圾收集,并将成为继续前进的指针。

虽然它不是免费的,但我记得它带有试用许可证,所以检查一下。

于 2009-10-28T16:26:35.577 回答