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

时间:2012-08-18 12:43:59

标签: java memory javafx-2

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

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

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

4 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:6)

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

我在研究如何在此时抓住“JVM状态”时重新发现this article - 在我用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路径。