我正在寻找一个可以列出已经内化的字符串的调试工具?理想情况下,我想添加一个标记并列出在该标记之后添加的字符串列表。
提前致谢。
答案 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
-
获取两个时间点之间添加的字符串列表更容易:
任何探查者甚至是jhat(如果你足够耐心)都应该可行。如果您使用YourKit,则可以使用书签功能并仅拍摄一个堆快照。