2011-05-30 16 views
19

我期待一個調試工具,可以列出已內化的字符串?理想情況下,我想標記一個標記,並在該標記後添加一個字符串列表。哪個調試工具可以列出字符串內部化?

在此先感謝。

+0

你用什麼IDE? – 2011-07-08 14:01:41

+0

@Ed Staub - 我在窗口計算機上使用eclipse,但是我在Linux計算機上用ant編譯並在那裏運行。你問來幹什麼? – 2011-07-08 15:14:18

+0

不確定這是否有用:您可以在String上放置一個調試器詳細格式化程序,以顯示它是否被攔截,例如:(this == this.intern())?(「^」+ toString()):toString )'。你能解釋一下你需要的工具嗎?是因爲你依賴於平等測試,還是你在查看內存使用情況,或者... – 2011-07-08 15:18:40

回答

1

在最近的Hotspot虛擬機上,實際的字符串看起來就像任何其他的 - 唯一的區別是底層字符數組正在被虛擬機跟蹤(我認爲它有一個額外的JNI引用,但它不顯示在YourKit轉儲 - 將是有趣的調查)。

也就是說,Yourkit提供了對重複字符串的內存檢查,我相信這是您所需要的。如果將它與'Trace Allocations'結合使用,您可以直接找到分配這些字符串的代碼。

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

-

獲得兩個時間點之間添加字符串列表比較容易:

  1. 獲取使用JMAP或你最喜歡的探查
  2. 做兩堆轉儲堆的差異
  3. 顯示字符串類的所有實例

應該可以使用任何分析器甚至jhat(如果你足夠耐心)。如果您使用YourKit,則可以使用書籤功能並僅使用一個堆快照。

+1

問題不是重複的字符串。重複在堆內存中,我得到了很多。問題是interned字符串。如果我看不到哪一個是被實施的,哪一個不是,那麼獲得所有字符串的列表將無濟於事。 – 2011-07-20 21:39:03

2

也許最簡單的方法是使用字節碼查看器。任何被實現的字符串將出現在包含String字面值的類文件的常量池中。例如,在我回答的另一個StackOverflow問題的最近類文件中,我的代碼中有以下字符串文字:"sun.awt.noerasebackground"。這在常量池中顯示爲'String_info'類型。字節碼查看器(和編輯器,所以要小心!)我使用的是JBE。 JBE Download

+0

您是否擁有JBE文檔的網址? – 2011-08-03 16:01:48

+0

這是一個小項目,據我所知沒有任何文檔。 – Josh 2011-08-07 04:15:13

相關問題