是否有可能获得Java中对象的所有引用。
我需要检查的是对象是否已删除所有回调订阅。
谢谢
答案 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