如何找出对象有多少引用?

时间:2014-01-28 04:56:46

标签: java memory reference jvm

是否有可能和/或很容易找出任意对象有多少传入引用?也就是说,有多少个对象指的是它。

提前致谢...

4 个答案:

答案 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中,选择课程并右键单击 - >查找用法。