如何在 Java Mission Control 中启用对象类型 + 分配堆栈跟踪 + GC 根路径

问题描述

我正在尝试使用 java 任务控制分析内存泄漏,我想找到对从中创建对象的类的引用,看起来我必须启用以下属性才能从活动对象详细信息中获取详细信息,但我无法找到此设置或不确定应从何处启用此设置,有人可以在这里帮助我吗?

“在开始飞行记录之前,请确保从内存泄漏检测设置中选择了对象类型 + 分配堆栈跟踪 + GC 根路径选项。”

活动对象下面是空的,因此无法找到哪个类负责创建内存中的对象

enter image description here

解决方法

三种方式:

  1. 在 JMC 中,右键单击应用程序并在 JVM 浏览器中选择“开始飞行记录”。在录制向导的第二页,在“Memory Leak Detection setting”中选择“Object Types + Allocation Stack Traces + Path to GC Root”,点击finish开始录制。

  2. 如果您是从 shell 开始录制,请在 JMC 顶部菜单中选择“窗口”->“飞行录制模板管理器”,复制配置并单击“编辑”。确保从“内存泄漏检测设置”中选择“对象类型+分配堆栈跟踪+GC根路径”并导出配置文件。然后你可以像这样使用这个文件。

    $ java -XX:StartFlightRecording:settings=custom.jfc ...

在已经运行的实例上:

$ jcmd <pid> JFR.start settings=custom.jfc
  1. 第三种方法,也许也是最简单的方法,是使用配置文件模板启用分配堆栈跟踪并直接设置 path-to-gc-roots 选项:

    $ java -XX:StartFlightRecording:settings=profile,path-to-gc-roots=true ...

在已经运行的实例上:

$ jcmd <pid> JFR.start settings=profile path-to-gc-roots=true