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

问题描述 投票:0回答:2

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

java heap-dump
2个回答
4
投票

如果您使用

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

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

您可以在这里找到更多信息:https://visualvm.github.io/documentation.html,部分使用 OQL 分析堆转储


3
投票

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

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

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

String
 的部分中看到 
Accumulated Objects in Dominator Tree

实例及其值(在我的屏幕截图中以黄色标记)

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

© www.soinside.com 2019 - 2024. All rights reserved.