对一个对象的所有引用

问题描述:


是否有可能获得对Java中的对象的所有引用。对一个对象的所有引用

我需要检查的是对象是否删除了所有回调订阅。

由于

+0

我需要这个在JUnit测试中不改变目标代码。但是,正如我所看到的,它无法完成。谢谢 – liborw 2010-10-21 14:07:53

这是经由JVMTI possivble并且通常由堆分析器完成的。但是,它不能从Java内部完成。

一种方法是保留一个弱引用的列表,以列出所有请求订阅的对象。只要对象订阅了另一个对象,就会在列表中添加对另一个对象的弱引用。每当对象取消订阅,请删除弱引用。通过检查列表是否为空来验证所有订阅已被删除。

如有必要,对于支持多种类型订阅的对象,这可以推广。

如果订阅没有附加到列表中,则可能会发生误报。

这是不可能的从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