java - 在 Java 调试 session 期间查找大字符串分配

标签 java string

在分析堆转储后,我发现分配了一些 30MB 的字符串(单个字符串 30MB)。
有没有办法在调试应用程序时设置断点,以便我可以找到分配这些巨大字符串的代码? 由于在应用程序运行期间分配了数千个字符串,因此不可能仅在每个字符串分配上放置一个断点。 我相信条件断点也会太慢。
如果可能的话,我想检查这些字符串内容以了解这些分配的来源。
例如,它们可能是 Web 服务调用的结果,该调用通常使用少量数据调用,但在极少数情况下会使用大量输入(这是我想要查找的情况)。

最佳答案

虽然您明确要求进行调试 session ,但我认为这主要是为了解决实际问题:分配了大字符串,而您不知道这是在哪里发生的。 p>

可以使用 jVisualVM 跟踪分配情况.您可以启动 jVisualVM 和您的程序,并将 jVisualVM 连接到您的程序。

如果这不符合您的需要,我可以删除这个答案。否则,您可以这样做:

在“Profiler”选项卡中,您可以选中右上角的“Settings”复选框,然后选择“Memory Settings”选项卡。您可以在那里设置“记录分配堆栈跟踪”复选框:

StringAlloc01

然后,在按下顶部的“内存”按钮后,探查器将收集有关字符串分配的信息。应用程序退出后(或拍摄快照后),您可以检查记录的堆栈跟踪以找到分配大字符串的方法 - 在本例中,method4:

StringAlloc02

关于java - 在 Java 调试 session 期间查找大字符串分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25357785/

相关文章:

c - 输入字符串时程序不打印字符

java - 如何从文件中分割给定的输入?

java - 在 arraylist 中保存类名并将参数发送到 Java 中的方法

java - 无法在 Pentaho 数据集成(Kettle)中运行 spoon.bat 或任何其他批处理文件

java - 正则表达式替换操作(如果存在于java中)

javascript - 将文本与数组项连接时覆盖文本

不带空格的 Word 的 Java 模式

java - 从简单的数学方程中提取变量(Java,字符串)

java - 如何使用 Java 解析 XML?

java - 为什么我的文本区域不可见?