Java 可以创建堆转储来分析内存泄漏而不进行垃圾收集吗?

Java 可以创建堆转储来分析内存泄漏而不进行垃圾收集吗?,java,memory-leaks,garbage-collection,Java,Memory Leaks,Garbage Collection,我们在生产中运行Java应用程序的VM上存在一些内存泄漏问题,旧的Gen堆使用率每天都在快速增长,因此我想创建堆转储来分析它 然而,我注意到VisualVM将在堆转储之前执行完全GC,这将清理旧的Gen,在这种情况下,堆转储将是无用的 我还尝试使用以下命令: jmap-dump:live,format=b,file=heap.bin 它还将触发一个完整的GC 请问是否有一种方法可以在没有完整GC(或没有GC)的情况下创建堆转储?或者有没有更好的方法来分析内存泄漏 JDK版本:1.7.0_45 谢

我们在生产中运行Java应用程序的VM上存在一些内存泄漏问题,旧的Gen堆使用率每天都在快速增长,因此我想创建堆转储来分析它

然而,我注意到VisualVM将在堆转储之前执行完全GC,这将清理旧的Gen,在这种情况下,堆转储将是无用的

我还尝试使用以下命令:

jmap-dump:live,format=b,file=heap.bin

它还将触发一个完整的GC

请问是否有一种方法可以在没有完整GC(或没有GC)的情况下创建堆转储?或者有没有更好的方法来分析内存泄漏

JDK版本:1.7.0_45


谢谢。

要创建堆转储,将有一个完整的GC。在堆外创建类柱状图时也同样适用

如果您想分析完整GC之间的内存泄漏,那么使用Java探查器(任务控制、jProfiler等)进行内存评测可能是您唯一的选择


请参阅此Q/A。

您可以使用JMX bean HotSpotDiagnostic和方法的第二个参数设置为false来触发HeapDump


有关更详细的回答,请参见此答案:

只需从选项中删除live,您应该会很好。当您向jmap提供“实时”选项时。您正在强制JVM运行一个完整的GC并捕获那些应该是“活动”的GC。
使用jmap-dump:format=b,file=hd.hprof

标记为正确的答案不再正确。 正如Sumit所说,只有在使用live选项时(在histo和dump操作中),才会导致完全GC

你有这个选择吗

-histo[:live]

打印堆的直方图。对于每个Java类,将打印对象数、内存大小(字节)和完全限定的类名。JVM内部类名以星号(*)前缀打印如果指定了活动子选项,则只统计活动对象。


-dump:[live,]format=b,file=filename

将hprof二进制格式的Java堆转储到文件名活动子选项是可选的,但如果指定,则仅转储堆中的活动对象。要浏览堆转储,可以使用jhat(1)命令读取生成的文件

您可以将该命令与操作GC.heap\u dump和选项-all一起使用

GC.heap\u转储 生成Java堆的HPROF格式转储。 影响:高:取决于Java堆大小和内容。除非指定了“-all”选项,否则请求完整GC

权限:java.lang.management.ManagementPermission(监视器)

语法:GC.heap\u dump[选项]

论据: 文件名:转储文件的名称(字符串,无默认值)

选项:(必须使用or=语法指定选项) -all:[可选]转储所有对象,包括无法访问的对象(布尔值,false)

示例:
jcmd 3181 GC.heap\u dump-所有转储

您可以添加
-XX:+PrintGCDetails
标志以查看是否出现完整GC。 例如,当我使用jcmd而不使用-all时,我看到类似这样的东西

200658:[完全GC(堆转储启动的GC)200658:[CMS:5040K->4158K(18432K),00171885秒]11239K->4158K(25856K),[Metaspace:18053K->18053K(1064960K)],00173941秒][次:用户=0,01系统=0,00,实数=0,02秒]


我尝试使用任务控制并在VM上为Flight Recorder添加-XX:+UnlockCommercialFeatures-XX:+FlightRecorder,但是,我无法启动该应用程序。我收到一条错误消息,上面写着“初始化JFR时出错。JFR将被停用。java.lang.Exception:无法在oracle.jrockit.JFR.VMJFR.instrument(VMJFR.java:408)的oracle.jrockit.JFR.JFR.init(JFR.java:108)上插入Throwable!”