我有一个Java应用程序,不幸的是,它在一段时间后开始消耗相当大的内存。更加复杂的是,它不仅仅是一个Java应用程序,还是一个JavaFX 2应用程序。
我怀疑存在某些内存泄漏,甚至可能是在底层JavaFX调用和本地库中。
理想的解决方案是在某个时刻获取所有Java对象的转储(包括它们的内存使用情况),然后分析该转储。是否有某种方式可以实现这一点?
我有一个Java应用程序,不幸的是,它在一段时间后开始消耗相当大的内存。更加复杂的是,它不仅仅是一个Java应用程序,还是一个JavaFX 2应用程序。
我怀疑存在某些内存泄漏,甚至可能是在底层JavaFX调用和本地库中。
理想的解决方案是在某个时刻获取所有Java对象的转储(包括它们的内存使用情况),然后分析该转储。是否有某种方式可以实现这一点?
有许多方法可以获取堆转储,从简单的工具如jmap到更高级的工具如JVisualVM或甚至商业工具如JProfiler。然而,正确解释这些转储可能会很棘手,因此您可能希望发布您要查找的内容。您是在寻找内存泄漏,还是对您的应用程序有一个总体感觉?
在研究抓取“此刻JVM状态”的方法时,我重新发现了这篇文章(archive.org archive)。在使用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。