制作java应用程序的“内存转储”?

我有Java应用程序,不幸的是,它在一段时间后开始消耗相当大的内存。 更复杂的是,它不仅是Java应用程序,它也是JavaFX 2应用程序。

我怀疑有一些内存泄漏,甚至可能在底层的JavaFX调用和本机库中。

理想的解决方案是在某个时刻获取所有java对象的转储(使用它们的内存),然后分析该转储。 有没有办法实现这个目标?

有许多方法可以获得堆转储,从jmap这样的简单工具开始,再到像JVisualVM这样的更多花哨的东西,甚至是JProfiler这样的商业工具。 正确解释这些转储可能会很棘手,因此您可能希望准确发布您要查找的内容。 正在寻找内存泄漏,或者您是否有兴趣了解您的应用程序?

使用jmap -heap:format=b 创建堆的二进制转储,然后可以将其加载到多个工具中 – 我最喜欢的是“Eclipse Memory Analyzer”

你可以使用jvisualvm 。 它有插件可以查看实时内存并从中获取转储。

我在研究如何在此时抓住“JVM状态”时重新发现了这篇文章 – 在我用jmap提取的一堆之后,大约只有MBeans报告的一半。 我会添加它以保证完整性:

 su $JVM_OWNER -c "gcore -o /tmp/jvm.core $YOUR_JVM_PID" su $JVM_OWNER -c "jmap -dump:format=b,file=jvm.hprof /usr/bin/java /tmp/jvm.core" 

需要安装gdb(用于gcore )和JDK安装(用于jmap)。 另请注意,您可能需要将/usr/bin/java调整为用于该进程的JVM的路径。