2010-10-21 111 views
2


是否有可能獲得對Java中的對象的所有引用。對一個對象的所有引用

我需要檢查的是對象是否刪除了所有回調訂閱。

由於

+0

我需要這個在JUnit測試中不改變目標代碼。但是,正如我所看到的,它無法完成。謝謝 – liborw 2010-10-21 14:07:53

回答

3

這是經由JVMTI possivble並且通常由堆分析器完成的。但是,它不能從Java內部完成。

1

一種方法是保留一個弱引用的列表,以列出所有請求訂閱的對象。只要對象訂閱了另一個對象,就會在列表中添加對另一個對象的弱引用。每當對象取消訂閱,請刪除弱引用。通過檢查列表是否爲空來驗證所有訂閱已被刪除。

如有必要,對於支持多種類型訂閱的對象,這可以推廣。

如果訂閱沒有附加到列表中,則可能會發生誤報。

1

這是不可能的從JVM中,但你可以通過使用jmap從JDK,那麼你可以使用jhat解析轉儲文件,然後單擊通至活着被帶到轉儲時引用創建一個堆轉儲。

結帳我這篇文章弗蘭克kieviet,其中JMAP和與jHat用於標識在Tomcat中PermGen的泄漏: http://blogs.oracle.com/fkieviet/entry/how_to_fix_the_dreaded

和JMAP和與jHat網站:

http://download.oracle.com/javase/6/docs/technotes/tools/share/jhat.html http://download.oracle.com/javase/6/docs/technotes/tools/share/jmap.html

相關問題