use*_*361 5 java heap garbage-collection visualvm heap-memory
我的程序中有一个错误,它产生了很多String实例(根据Heap中7000+ VisualVM).我试图找出哪个类负责这个,所以我可以理解它为什么会发生.
以下是堆转储的示例String:

我如何确定哪个类负责生成每个String?我正在和大约40个班级一起工作,所以我希望能够在可能的情况下确定罪魁祸首课程VisualVM.
你应该看看这个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 的对象)。