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

标签 java performance memory-leaks jmc jfr

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

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

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

enter image description here

最佳答案

JMC 选项,例如“对象类型 + 分配堆栈跟踪 + GC 根路径”,可以在 JDK 17 的命令行上设置:

memory-leaks=<off|types|stack-traces|gc-roots> 

例如:

$ java -XX:StartFlightRecording:memory-leaks=gc-roots 

$ jcmd <pid> JFR.start memory-leaks=gc-roots 

对于 JDK 17 之前的版本,有以下三种方式:

  1. 在 JMC 中,右键单击应用程序并在 JVM 浏览器中选择“开始飞行记录”。在录制向导的第二页,从“内存泄漏检测设置”中选择“对象类型+分配堆栈跟踪+GC根路径”,然后单击“完成”开始录制。

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

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

在已经运行的实例上:

$ jcmd <pid> JFR.start settings=custom.jfc
  • 第三种方法,也许是最简单的方法,是使用配置文件模板来启用分配堆栈跟踪并直接设置 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
    

    关于java - 如何在 Java Mission Control 中启用对象类型 + 分配堆栈跟踪 + GC 根路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66957896/

    相关文章:

    c - 开发过程中的内存泄漏

    java - 如何将 session 从一个 servlet 转发到另一个?

    java - 从解析对象查询回调返回对象数据

    java.text.ParseException : Unparseable date: "

    python - 正则表达式速度 : Python x6 times faster than C++11 under VS2013?

    performance - 性能与可读性

    swift - 由于引用循环导致 swift 内存泄漏

    c++ - LeakSanitizer : get run time leak reports?

    java - 仅当选中复选框时才在数据集中添加值

    java - 向 Java 应用程序添加许多框架 - 会产生任何负面影响吗?