2014-04-30 32 views
5

我们在运行Java应用程序的虚拟机上存在一些内存泄漏问题,旧Gen堆的使用量每天都在快速增长,所以我想创建堆转储来分析它。可以创建堆转储分析内存泄漏没有垃圾收集?

但是,我注意到VisualVM将在堆转储之前执行完整的GC,这将清理旧的代码,在这种情况下,堆转储将毫无用处。

我也试着用下面的命令:

JMAP转储:现场,格式= B,文件= heap.bin

它也将触发一个完整的GC。

我可以问,如果没有完整的GC(或没有GC)可以创建堆转储的方法吗?或者有没有更好的方法来分析内存泄漏?

JDK版本:1.7.0_45

谢谢。

回答

3

要创建堆转储,将会有一个完整的GC。从堆中创建类直方图时也是如此。

如果您想分析完整GC之间的内存泄漏,那么使用Java分析器(Mission Control,jProfiler等)可能是内存分析是您唯一的选择。

看到这个Q/A为Java Mission Control Heap Profile

+0

我尝试使用Mission Control并在VM上为Flight Recorder添加-XX:+ UnlockCommercialFeatures -XX:+ FlightRecorder,但是我无法启动应用程序。我收到错误消息说:“初始化JFR时出错,JFR将被停用。java.lang.Exception:无法通过仪器Throwable! at oracle.jrockit.jfr.VMJFR.instrument(VMJFR.java:408) at oracle.jrockit .jfr.JFR.init(JFR.java:108)“ – zhengyu

+0

请参阅http://stackoverflow.com/q/19056826/772000 –

1

只是生活从选项中删除,你应该是不错的。当你向jmap提供“live”选项时。你迫使JVM运行一个完整的GC并捕获那些应该是“活的”。 使用jmap -dump:format = b,file = hd.hprof。

+0

此方法工作得很好。 – alexandrul

相关问题