哪个调试工具可以列出内部化的字符串?

2022-09-02 11:02:04

我正在寻找一个可以列出已内部化的字符串的调试工具?理想情况下,我想放一个标记,并有一个在该标记之后添加的字符串列表。

提前致谢。


答案 1

也许最简单的方法是使用字节码查看器。任何暂存的字符串都将出现在包含 String 文本的类文件的constant_pool中。例如,在我回答的另一个StackOverflow问题的最新类文件中,我的代码中有以下字符串文本:.这在常量池中显示为一种类型。我使用的字节码查看器(和编辑器,所以要小心!)是JBE。新浪网下载"sun.awt.noerasebackground"'String_info'


答案 2

在最近的 Hotspot VM 上,插入的字符串看起来就像任何其他字符串一样 - 唯一的区别是底层 char 数组正在被 VM 跟踪(我认为它有一个额外的 JNI 引用,但它不会显示在 YourKit 转储上 - 调查起来会很有趣)。

也就是说,Yourkit为重复的字符串提供了内存检查,我相信这可以满足您的需求。如果将其与“跟踪分配”结合使用,则可以直接访问分配这些字符串的代码。

查看 http://www.yourkit.com/docs/95/help/inspections_mem.jsp#duplicate_strings

--

获取在两个时间点之间添加的字符串列表更容易:

  1. 使用 jmap 或您最喜爱的分析器获取两个堆转储
  2. 对堆进行差异
  3. 显示 String 类的所有实例

应该与任何分析器甚至jhat一起使用(如果您有足够的耐心)。如果您使用 YourKit,则可以使用书签功能,并且只能拍摄一个堆快照。