如何确定在VisualVM堆转储中实例化对象的位置

use*_*361 5 java heap garbage-collection visualvm heap-memory

我的程序中有一个错误,它产生了很多String实例(根据Heap中7000+ VisualVM).我试图找出哪个类负责这个,所以我可以理解它为什么会发生.

以下是堆转储的示例String:

在此输入图像描述

我如何确定哪个类负责生成每个String?我正在和大约40个班级一起工作,所以我希望能够在可能的情况下确定罪魁祸首课程VisualVM.

Ale*_*leš 3

你应该看看这个Q/A:How to view内存分配堆栈跟踪在Java VisualVM - 堆配置文件,这是一个“内存分配堆栈跟踪”就是你想要的。

这是一个很好的教程:使用 VisualVM 分析 Java 应用程序中的内存泄漏

一般来说,有多种方法可以使用 Java 分析器来诊断此问题:

  • 使用CPU profiling,最好是在instrumentation模式下,这会记录所有的方法调用,看一下String.<init>——这会告诉你所有可能执行的方法new String()。最好的工具是 jProfiler、Java Mission Control,您可以在其中轻松识别String.<init>. 这同样适用于 VisualVM。我认为使用 CPU 分析是识别代码中出现次数new String最多的位置的最直接方法。

  • 在 MAT 中收集堆转储,并进行分析,这将允许您遍历堆,您将再次搜索 String 查找对对象的所有引用String

  • 使用Java分析器(例如VisualVM)的堆分析选项,类似于收集堆转储,只是此堆分析通常在线收集。因此,只需在 VisualVM 中启用堆分析并跟踪 String 实例的引用(即查找引用 String 的对象)。