如何在VisualVM Heap Dump中确定对象实例化的位置

8
我程序中有一个bug,它生成了很多String实例(根据VisualVM,在Heap中超过7000个)。我正在尝试隔离哪个类负责这个问题,以便我可以理解为什么会发生这种情况。
以下是String的Heap dump示例:
如何找出每个String实例是哪个类生成的?我同时使用了大约40个类,因此如果可能的话,我希望能够通过VisualVM识别罪犯类。

你已经解决了这个问题吗? - Aleš
@Ales0x 我会在1-2天内重新审视这个问题,到时候我就可以回答了。 - user2763361
1个回答

3
你应该查看这个问题和答案:如何在Java VisualVM中查看内存分配堆栈跟踪 - 堆剖面是你想要的“内存分配堆栈跟踪”。
这里有一个不错的教程:使用VisualVM分析Java应用程序中的内存泄漏
一般来说,有几种方法可以诊断这个问题,使用一个Java分析工具:
- 使用CPU分析,最好使用仪器模式,这将记录所有方法调用,查看String.<init> - 这将显示执行new String()的所有可能方法。最好的工具是jProfiler、Java Mission Control,您可以轻松地识别String.<init>的所有调用者。VisualVM也适用。我认为使用CPU分析是确定new String在代码中出现最多的位置的最直接的方法。 - 在MAT中收集堆转储文件并进行分析,这将允许您遍历堆,您将再次搜索字符串,找到所有引用String对象的引用。 - 使用Java分析工具(例如VisualVM)的堆剖面选项,类似于收集堆转储文件,只是这种堆剖面通常在线收集。所以只需在VisualVM中启用堆剖面,并从String实例(即查找引用String的对象)跟踪引用。

那个教程链接非常有用!谢谢。 - Saeid Nourian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接