首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java内存泄漏

Java内存泄漏
EN

Stack Overflow用户
提问于 2009-10-28 23:28:49
回答 6查看 8.2K关注 0票数 4

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-10-29 00:28:06

尽管-XX:+HeapDumpOnOutOfMemoryError可能很有用,但我当前使用Eclipse Memory Manager的工作流程是:

  1. 正常运行程序,等待内存失控。
  2. Run jmapjmap -dump:format=b,file=dump.hprof <PID>
  3. Open
  4. hprof file in EMM。

我通常首先使用直方图和主控树视图来查看是否有异常,然后从那里向下钻取。

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

票数 2
EN

Stack Overflow用户

发布于 2009-10-28 23:34:15

也许最简单的事情是在HProf (作为JVM虚拟机的标准)下运行您的程序一段时间,然后强制退出。HProf的输出很有希望能给你一些直接的提示。你的内存泄露。

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

票数 2
EN

Stack Overflow用户

发布于 2009-10-29 00:18:29

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

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

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1638011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档