Java内存泄漏

时间:2009-10-28 15:28:49

标签: java eclipse out-of-memory

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

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

  

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

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

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

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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