14

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

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

理想的解决方案是在某个时刻(连同它们的内存使用情况)获取所有 java 对象的转储,然后分析该转储。有没有办法做到这一点?

4

4 回答 4

18

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

于 2014-01-24T11:40:27.700 回答
6

有很多方法可以获得堆转储,从 jmap 之类的简单工具到 JVisualVM 之类的更花哨的工具,甚至 JProfiler 之类的商业工具。但是,正确解释这些转储可能会很棘手,因此您可能希望准确地发布您正在寻找的内容。正在寻找内存泄漏,或者您是否有兴趣了解您的应用程序的总体感觉?

于 2012-08-18T12:49:49.627 回答
5

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

于 2012-08-18T12:50:00.330 回答
3

在研究获取“此时此刻的 JVM 状态”的方法时,我刚刚重新发现了这篇文章jmap——在我拉取的堆大小大约是 MBean 报告的大小的一半之后。为了完整起见,我将添加它:

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

于 2016-10-21T10:08:11.117 回答