20

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

提前致谢。

4

2 回答 2

2

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

于 2011-08-02T21:42:43.530 回答
1

在最近的 Hotspot VM 上,实习字符串看起来和其他字符串一样 - 唯一的区别是 VM 正在跟踪底层 char 数组(我认为它有一个额外的 JNI 引用,但它没有显示在 YourKit 转储中 - 将是有趣的调查)。

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

请参阅http://www.yourkit.com/docs/95/help/inspections_mem.jsp#duplicate_strings

--

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

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

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

于 2011-07-17T14:23:26.320 回答