是否有可能和/或很容易找出任意对象有多少传入引用?也就是说,有多少个对象指的是它。
提前致谢...
答案 0 :(得分:4)
简短的回答是:自己计算。
这个其他StackOverflow问题有一些有用的答案和资源
Is it possible to get the object reference count?
此页面上显示了更多Google信息:http://www.velocityreviews.com/forums/t363649-how-do-i-get-a-reference-count-of-a-object-in-java.html
这表明以下内容:
Java不维护引用计数。一个特定的JVM可能(我 没有听说过这样做,但是如果JVM保持参考 计算JVM实施内部的“私事”。 Java没有构造或实用程序类来检索引用计数, 即使JVM碰巧维护它们。 (同样,JVM可能会 维护与其JIT编译器相关的计数器,但那些 Java本身无法访问统计信息。)
如果您想维护自己对象的引用计数,那么您将会这样做 需要手动完成。这可能是一个容易出错的业务:
MyObject ref = null; try { // get a reference, increment counter ref = MyObject.getReference(args); ... } finally { // decrement counter, promising to drop reference if (ref != null) { ref.release(); ref = null; } }
您可以建立一个需要此类的自我强制“协议” 每次使用MyObject时的样板,但它会很笨拙 而且很容易出错。并非所有情况都如此简单 上面的一个:例如,如果你有两个生命周期的引用 重叠但不嵌套,你不能将它们与词法范围相匹配 尝试/终于如此整洁。
收藏框架几乎是禁止的,或者至少是禁止的 很难用。当您将MyObject放入SortedMap时,为 例如,地图中保留了多少对MyObject的引用? 答案取决于MyObject是用作键还是用作 价值,或两者兼而有之?在我看来,你有机会维持一个 准确的数量很少。
退后一步:为什么要这些参考计数?目的是什么 你想要实现吗?可能有更好的方法来实现你的目标 整体战略要比追求这种非常困难的策略。
答案 1 :(得分:2)
如果您确实需要此信息,请触发javacore转储,然后分析其中包含的信息。但除非你有一个特定的问题需要解决,例如“内存泄漏”,否则你可能不需要这些信息。
答案 2 :(得分:0)
这个问题只能由一个拥有非世代停止垃圾收集器的虚拟机来回答。 JVM不需要这样的垃圾收集器,所以,不,这是不可能的。
即使使用这样的GC,也允许不同的线程保留非易失性字段的副本。如果走动实时对象图寻找特定对象,这可能会混淆您将找到的引用数量。
答案 3 :(得分:0)
在Netbeans中,您可以使用“查找用法”功能查看特定项目在特定项目中的引用位置。
在Project Explorer中,选择课程并右键单击 - >查找用法。