做一个;“内存转储”;java应用程序的开发?

做一个;“内存转储”;java应用程序的开发?,java,memory,javafx-2,Java,Memory,Javafx 2,我有一个Java应用程序,不幸的是,它在一段时间后开始消耗相当大的内存。更复杂的是,它不仅是Java应用程序,也是JavaFX2应用程序 我怀疑有一些内存泄漏,甚至可能是在底层JavaFX调用和本机lib中 理想的解决方案是在某个时刻获取所有java对象的转储(及其内存使用情况),然后分析该转储。有什么方法可以实现这一点吗?有很多方法可以获得堆转储,从像jmap这样的简单工具开始,到像JVisualVM这样更奇特的东西,甚至是像JProfiler这样的商业工具。但是,正确解释这些转储可能很棘手,

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

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


理想的解决方案是在某个时刻获取所有java对象的转储(及其内存使用情况),然后分析该转储。有什么方法可以实现这一点吗?

有很多方法可以获得堆转储,从像jmap这样的简单工具开始,到像JVisualVM这样更奇特的东西,甚至是像JProfiler这样的商业工具。但是,正确解释这些转储可能很棘手,所以您可能希望准确地发布您正在寻找的内容。您是在寻找内存泄漏,还是对应用程序的总体感觉感兴趣?

您可以使用。它有一个插件,可以查看实时内存并从中获取转储。

使用
jmap-heap:format=b
创建堆的二进制转储,然后可以将其加载到多个工具中——我最喜欢的是“Eclipse内存分析器”

我在研究获取“此时此刻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路径。

您正在使用什么平台?Linux,Win,Mac?@BalázsMáriaNémeth-Linux(Ubuntu10.10)。我正在寻找一些内存泄漏的可能副本,甚至可能是在本机libs中:(如果泄漏确实是由JavaFX类引起的,那么要找到泄漏是相当困难的(尽管我不知道有任何问题)。如果您有权访问它,我建议为此使用JProfiler,尽管我相信其他应用程序(我可能不知道)也可以完成此工作。基本方法是获取堆转储,检查可疑的对象总体,并使用该工具将实例追溯到其GC根(你不想手工做的事情)。此功能基本上说明了实例未被垃圾收集的原因。我现在正在使用jvisalvm,从我的应用程序堆大小缓慢增长的事实判断,这不是本机泄漏的结果,而是java对象泄漏的结果。因此,我希望这将很容易解决。感谢您的帮助!请记住在您实际获得OOMEException之前,不断增长的堆不会证明内存泄漏。根据您的垃圾收集器的不同,在需要完全收集之前,堆可能只是未收集的垃圾。不幸的是,我检查了(通过从jvisualvm强制GC)实际上的问题是,即使应用程序什么都不做,内存也会不断积累。