问题描述
|
我正在寻找可以列出已被内部化的字符串的调试工具吗?理想情况下,我想标记一个标记,并列出在该标记之后添加的字符串的列表。
提前致谢。
解决方法
也许最简单的方法是使用字节码查看器。所插入的任何String都会存在于包含String文字的类文件的constant_pool中。例如,在我回答的另一个StackOverflow问题的最新类文件中,我的代码中包含以下String文字:“ 0”。这在常量池中显示为“ 1”类型。我使用的字节码查看器(和编辑器,所以要当心!)是JBE。 JBE下载
, 在最新的Hotspot VM上,插入的字符串看起来与其他字符串一样-唯一的区别是VM正在跟踪底层的char数组(我认为它具有额外的JNI引用,但不会在YourKit转储中显示-将是有意思的研究)。
就是说,Yourkit提供了对重复字符串的内存检查,我相信它可以满足您的需求。如果将它与\“ Trace Allocations \”结合使用,则可以直接进入分配这些字符串的代码。
参见http://www.yourkit.com/docs/95/help/inspections_mem.jsp#duplicate_strings
-
获取在两个时间点之间添加的字符串列表更加容易:
使用jmap或您喜欢的分析器获取两个堆转储
进行堆比较
显示String类的所有实例
应该可以与任何探查器甚至jhat一起使用(如果您足够耐心的话)。如果使用YourKit,则可以使用书签功能,并且仅拍摄一个堆快照。