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

时间:2011-05-30 19:21:49

标签: java string string-interning

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

-

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

  1. 使用jmap或您最喜欢的探查器获取两个堆转储
  2. 做一堆堆的差异
  3. 显示String类的所有实例
  4. 任何探查者甚至是jhat(如果你足够耐心)都应该可行。如果您使用YourKit,则可以使用书签功能并仅拍摄一个堆快照。