对对象的所有引用

时间:2010-10-21 13:51:23

标签: java


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

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

谢谢

3 个答案:

答案 0 :(得分:3)

这可以通过JVMTI进行,通常由堆分析器完成。但是,它无法在Java中完成。

答案 1 :(得分:1)

一种方法是保留对已请求订阅的所有对象的弱引用列表。每当对象订阅另一个时,向列表添加对另一个的弱引用。每当对象取消订阅时,删除弱引用。通过检查列表是否为空来验证是否已删除所有订阅。

如有必要,可以针对支持多种订阅的对象进行推广。

如果订阅没有添加到列表中,则会出现误报。

答案 2 :(得分:1)

这在JVM中是不可能的,但您可以使用jdk中的jmap创建堆转储,然后您可以使用jhat解析转储文件并单击活动的引用当转储被采取。

从frank 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