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

时间:2014-01-10 11:52:54

标签: java garbage-collection heap heap-memory visualvm

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

以下是String的堆转储示例:

enter image description here

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

1 个答案:

答案 0 :(得分:3)

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

这是一个很好的教程:Analyzing Memory Leak in Java Applications using VisualVM

通常,有几种方法可以使用Java分析器诊断此问题:

  • 使用 CPU性能分析,这是检测模式中最好的,这将记录所有方法调用,查看String.<init> - 这将显示执行{的所有可能方法{1}}。最好的工具是例如jProfiler,Java Mission Control,您可以轻松识别new String()的所有呼叫者。这同样适用于VisualVM。我认为使用CPU分析是识别代码中String.<init>出现次数最多的最简单方法。

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

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