我想知道是否有一种方法可以检查Java对象有多少引用。据我所知,唯一的方法是通过JNI接口使用JVMTI来完成。是否有一种纯Java(不使用本地库)的解决方案来获取此信息?
我们正在开发一个数据结构动画教学工具(用于与学生实现某些算法),因此如果我们能以最非侵入性的方式检查“释放”的对象,那将非常好(我试图避免强制此工具的用户调用诸如objectReleased(objRef)
这样的方法,以便在元素删除或类似操作时更新数据结构动画)。
我想知道是否有一种方法可以检查Java对象有多少引用。据我所知,唯一的方法是通过JNI接口使用JVMTI来完成。是否有一种纯Java(不使用本地库)的解决方案来获取此信息?
我们正在开发一个数据结构动画教学工具(用于与学生实现某些算法),因此如果我们能以最非侵入性的方式检查“释放”的对象,那将非常好(我试图避免强制此工具的用户调用诸如objectReleased(objRef)
这样的方法,以便在元素删除或类似操作时更新数据结构动画)。
根据你的描述,似乎你更关心对象被回收的时间,而不是实际引用计数。如果是这种情况,你可以使用 WeakReference
或者 PhantomReference
来确定一个被引用的对象何时准备进行 finalization。
参见:
WeakReference
的 Javadoc: http://download.oracle.com/javase/6/docs/api/java/lang/ref/WeakReference.htmlPhantomReference
的 Javadoc: http://download.oracle.com/javase/6/docs/api/java/lang/ref/PhantomReference.html我们不能获取不存在的东西。
参见类似的问答:
它解释了为什么引用递归不会导致内存泄漏:
https://stackoverflow.com/a/72167978/8740349
请参阅PhantomReference
类的Javadoc:
download.oracle.com/javase/6/docs/api/java/lang/ref/PhantomReference.
此外,有一个库可以在对象被垃圾回收时通知您:
https://sourceforge.net/projects/gcradar