我的程序中有一个错误,它生成了很多String
个实例(根据VisualVM
在堆中7000+)。我试图找出哪个类负责这个,所以我可以理解它为什么会发生。
以下是String
的堆转储示例:
如何确定哪个类负责生成每个String
?我正在和大约40个班级一起工作,所以如果可能的话,我希望能够通过VisualVM
确定罪魁祸首课程。
答案 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的对象)。