制作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的路径。