我如何具体检查哪些Java字符串被保留,导致内存泄漏?

时间:2016-03-31 20:23:18

标签: java heap-dump

我可以在heapdump文件中看到String类耗尽内存,但我怎么知道这些字符串是什么?

2 个答案:

答案 0 :(得分:4)

如果您使用VisualVM,则可以使用几个OQL查询来读取您要查找的Java堆中的数据。一个可能适合您需求的命令是:

 select {instance: s, content: s.toString()} from java.lang.String s
    where /java/(s.toString())

你可以在这里找到更多:https://visualvm.java.net/oqlhelp.html

答案 1 :(得分:3)

我使用一个小的Spring Boot应用程序和Eclipse Memory Analyzer来模拟它。堆转储是从MAT内部创建的,但您也可以打开已经创建的堆转储。

当您打开堆转储时,MAT会自动显示哪些内存占用了大量内存:

enter image description here

当您打开详细信息时,您可以在String

部分中看到Accumulated Objects in Dominator Tree个实例及其值(在我的屏幕截图中以黄色标记)

enter image description here

简短说明:您也可以在MAT中运行OQL:

enter image description here