繁体   English   中英

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

[英]Making a “memory dump” of java application?

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

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

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

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

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

你可以使用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的路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM