Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 运行时堆分析;匹配模式的字符串何时初始化_Java_Profiling_Heap Memory_Heap Dump - Fatal编程技术网

Java 运行时堆分析;匹配模式的字符串何时初始化

Java 运行时堆分析;匹配模式的字符串何时初始化,java,profiling,heap-memory,heap-dump,Java,Profiling,Heap Memory,Heap Dump,我有一个Java程序,它最终会创建一个与“schema.sql”匹配的字符串。我想在源代码中找到发生这种情况的地方。在源代码上搜索“schema.sql”不会产生位置。相反,程序必须在运行时创建字符串。我只是不知道在哪里。它发生在我项目的某个库中。我怎样才能找到我的程序在哪里创建这个字符串 我可以在运行时以某种方式查看堆以查找与“schema.sql”匹配的字符串吗?我研究了VisualVM之类的东西,但它似乎只分析堆转储,而不是堆的运行状态。必须有办法做到这一点;有什么想法吗 您可以通过以下步

我有一个Java程序,它最终会创建一个与“schema.sql”匹配的字符串。我想在源代码中找到发生这种情况的地方。在源代码上搜索“schema.sql”不会产生位置。相反,程序必须在运行时创建字符串。我只是不知道在哪里。它发生在我项目的某个库中。我怎样才能找到我的程序在哪里创建这个字符串

我可以在运行时以某种方式查看堆以查找与“schema.sql”匹配的字符串吗?我研究了VisualVM之类的东西,但它似乎只分析堆转储,而不是堆的运行状态。必须有办法做到这一点;有什么想法吗

您可以通过以下步骤完成此操作:

1) 通过在会话启动对话框中配置适当的分配记录配置文件,在启动时启动分配记录

2) 在您认为字符串已创建后,拍摄堆快照

3) 双击heap walker的classes视图中的
java.lang.String
行,创建一个包含所有字符串的新对象集

4) 切换到“传出引用视图”

5) 通过选择“应用过滤器->通过限制所选值”并输入字符串值来搜索字符串

6) 切换到allocations视图并签出堆栈跟踪


免责声明:我的公司开发了JProfiler。

你为什么要这么做?为什么你这么肯定你的某个地方有字符串“schema.sql”?@ElliottFrisch我的项目中有一个库,它在我的类路径上执行sql脚本,名为
“schema.sql”
。因此,库可能会构造一些字符串来指定此文件的路径。该字符串将由
“schema.sql”
匹配。事实上,我在运行时调试时发现了它,字符串是
“classpath*:schema all.sql,classpath*:schema.sql”
。基本上,我希望有一个增强的条件断点来分析程序中的所有字符串,而不仅仅是像
x==“foo”
这样的东西。你要做的是检查你的程序接触到的每个对象,并查询“instanceof String”,在那里创建一个断点挂钩。你最好用另一种方式来解决你的问题。打印所有语句来解释其当前阶段,或者猜测它是什么,并注释一些代码,直到问题消失。@PerryMonschau我听到了,所以我想要的比我想象的要贵。诚然,我会像你说的那样依靠其他调查手段来找出答案。只是我有60个库和一个非常简单和完整的描述我想要什么;所以我希望我能告诉我的IDE或者写一些代码来实现这一点。Fwiw就在两周前,有人提出了一个基本相同的问题,当时还没有得到回答