我有Java应用程序,不幸的是,它在一段时间后开始消耗大量内存。更复杂的是,它不仅是Java应用程序,也是JavaFX 2应用程序。
我怀疑存在内存泄漏,甚至可能在底层JavaFX调用和本机库中。
理想的解决方案是在某个时刻获取所有java对象的转储(使用它们的内存),然后分析该转储。有没有办法实现这个目标?
答案 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路径。