有人使用Eclipse内存管理器来检测java代码中的内存泄漏吗?有人可以推荐一个查找有关使用内存管理器的信息的好地方吗?我在网上读到一些内容,它建议我需要让程序运行直到崩溃(发生内存不足错误),这将生成崩溃报告。然后使用内存管理器打开这个报告来检查哪里可能发生内存泄漏。大家都是这样使用内存管理器的吗?

有帮助吗?

解决方案

虽然 -XX:+ HeapDumpOnOutOfMemoryError 非常有用,我目前使用Eclipse Memory Manager的工作流程是:

  1. 正常运行程序
  2. 等待记忆失控。
  3. 运行 jmap jmap -dump:format = b,file = dump.hprof< PID>
  4. 在EMM中打开hprof文件。
  5. 我通常开始使用直方图和支配树视图来查看是否有任何问题,然后从那里向下钻取。

    在使用堆转储时,VisualVM可能很有用,但效率却低于EMM(EMM会缓存有关加载堆转储的大量信息)。 Netbeans Profiler非常适合获取分配位置和时间分析。

其他提示

也许最简单的方法是在 HProf 下运行您的程序(作为JVM的标准配置)已经有一段时间了,并强制退出。 HProf的输出应该有希望给你一些即时指针。你的记忆泄漏。

与Eclipse内存调试器(我只知道您编写的内容)不同,您可以从执行中的任何位置收集统计信息。

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

我不认为这是真的 - 当 OutOfMemoryError 发生(我敢打赌作者将此问题与某种 JVM 错误混淆了,该错误会导致保存核心转储)。

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

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

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

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

我通常更喜欢使用NetBeans Profiler分析应用程序。在大多数情况下,您可以非常轻松地查看哪些对象正在泄漏以及它们的创建位置。可能还有其他几种工具可以做到这一点,但我知道NetBeans Profiler运行良好,并且易于使用。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top