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

How do I inspect specifically what Java strings are being kept around, causing memory leak?

我可以在 heapdump 文件中看到字符串 class 耗尽了内存,但我如何知道这些字符串具体是什么?

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

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

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

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

当您打开堆转储时,MAT 会自动显示您怀疑哪些正在使用大量内存:

当您打开详细信息时,您可以在名为 Accumulated Objects in Dominator Tree

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

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