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

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

提前致谢。

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

在最近的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类的所有实例

应该适用于任何探查器甚至是jhat(如果你足够耐心)。 如果使用YourKit,则可以使用书签function并仅使用一个堆快照。