有没有人使用Eclipse内存管理器来检测java代码中的内存泄漏?有没有人能推荐一个好的地方来查找关于使用内存管理器的信息?我在网上读到一些东西,它建议我需要让程序运行,直到它崩溃(发生内存不足错误),这将生成一个崩溃报告。然后使用内存管理器打开此报告,检查可能发生内存泄漏的位置。这是每个人使用内存管理器的方式吗?
发布于 2009-10-29 00:28:06
尽管-XX:+HeapDumpOnOutOfMemoryError可能很有用,但我当前使用Eclipse Memory Manager的工作流程是:
jmap -dump:format=b,file=dump.hprof <PID>我通常首先使用直方图和主控树视图来查看是否有异常,然后从那里向下钻取。
VisualVM可能很有用,但在处理堆转储时效率似乎比EMM低得多(EMM在装入堆转储时缓存了大量信息)。Netbeans Profiler非常适合用于获取分配位置和时间分析。
发布于 2009-10-28 23:34:15
也许最简单的事情是在HProf (作为JVM虚拟机的标准)下运行您的程序一段时间,然后强制退出。HProf的输出很有希望能给你一些直接的提示。你的内存泄露。
与Eclipse内存调试器(我只了解您编写的内容)不同,您可以从执行过程中的任何点收集统计信息。
发布于 2009-10-29 00:18:29
它建议我需要让程序运行,直到它崩溃(发生内存不足错误),这将生成一个崩溃报告。
我不认为这是真的--当OutOfMemoryError发生时,你不会得到一个转储文件(我敢打赌,作者把这个问题与某种可能导致核心转储被保存的JVM bug混淆了)。
最好的过程是使用jmap进行堆转储;这将把堆的内容输出到一个二进制文件(通常称为hprof文件)。然后,该文件可以由任意数量的分析器进行分析:
我强烈推荐使用Eclipse插件,因为它可以非常快速地加载大型(> 500MB)堆转储(在一分钟之内),生成有用的报告,支持具有复杂逻辑的查询语言等。
https://stackoverflow.com/questions/1638011
复制相似问题