我正在尝试使用java任务控制来分析内存泄漏,我想找到对创建对象的类的引用,看起来我必须启用以下属性才能从 Activity 对象详细信息中获取详细信息,但我无法找到此设置,或者不确定应该从哪里启用此设置,有人可以在这里帮助我吗?
“开始飞行记录之前,请确保从“内存泄漏检测”设置中选择“对象类型 + 分配堆栈跟踪 + GC 根路径”选项。”
下面的 Activity 对象是空的,因此无法找到哪个类负责创建内存中的对象
最佳答案
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 之前的版本,有以下三种方式:
在 JMC 中,右键单击应用程序并在 JVM 浏览器中选择“开始飞行记录”。在录制向导的第二页,从“内存泄漏检测设置”中选择“对象类型+分配堆栈跟踪+GC根路径”,然后单击“完成”开始录制。
如果您从 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/