Java 获取运行时对对象的引用量

Java 获取运行时对对象的引用量,java,pointers,dictionary,reference,Java,Pointers,Dictionary,Reference,是否可以查看当前有多少个对象引用 形势 我将Map.Entry的实例存储在它们的Map以外的引用中,因此我可以将它们保存在需要它们的地方,直接访问值,而无需不断检查其键的映射 我希望将引用更新为更改为映射。如果我使用Map.get(key),它们不会 但是,这也有问题… 如果删除了条目,则该条目仍可能存在于仍将返回该值的引用中。不过,我可以选择从不删除,但将它们设置为null,以克服这一问题 但是,我担心,如果使用了大量临时唯一键(如日期),随着时间的推移,上面的内容会导致内存中充满大量的nul

是否可以查看当前有多少个对象引用

形势
我将
Map.Entry
的实例存储在它们的
Map
以外的引用中,因此我可以将它们保存在需要它们的地方,直接访问值,而无需不断检查其键的映射

我希望将引用更新为更改为
映射
。如果我使用
Map.get(key)
,它们不会

但是,这也有问题…
如果删除了
条目
,则该条目仍可能存在于仍将返回该值的引用中。不过,我可以选择从不删除,但将它们设置为
null
,以克服这一问题

但是,我担心,如果使用了大量临时唯一键(如日期),随着时间的推移,上面的内容会导致内存中充满大量的
null
条目

我想,如果有一种方法可以获得
映射的引用量。值为
null
条目
,如果它是
1
,那么它就是
映射中的一个,这意味着没有其他引用,因此可以安全地删除
条目
。否则,如果有其他引用,它应该保持并仍然返回
null


有这种可能性吗?

Java内存管理不是这样工作的。没有任何东西可以跟踪对象的引用数

听起来你真正的问题是你没有一个好的对象生命周期模型。如果有什么东西正在检索
Map.Entry
对象,并在本应收集的引用之后保留引用,那么这就是漏洞所在。您可能应该使用内存探查器(我发现它在这方面很有用,但也有其他的)来确定什么在填充内存

它们是关于C#,而不是Java的,但这些博客文章中的要点也适用于您的情况:


你发明了垃圾收集器吗?你所说的“要用大量空值填充的内存”是什么意思?@Sleiman Map.输入值为空的对象以及这将如何填充内存?我不知道不断检查映射的
有什么错。如果您使用的是
HashMap
map.get()
map.containsKey()
基本上是免费的,所以为了避免出现这种情况,请保持使用
map.Entry
对象(并可能造成内存泄漏)是没有意义的。您可能误解了这个问题吗?这不是关于内存泄漏/垃圾收集。你是否建议不要引用条目,而寻找另一种方法来实现我的目标?@Myst:你的问题有点不清楚,完全可能是我误解了。但从根本上说,我坚持我的答案:你的问题似乎是你没有一个好的对象生命周期模型。如果您发现您的应用程序使用的内存比预期的要多,我肯定会使用内存分析器来了解发生了什么。在我们帮助您决定正确的解决方案之前,您需要提供有关该问题的更多数据,但我非常确定,任何基于“获取引用数量”的解决方案都是错误的。我希望对地图中的对象进行引用,并通过对地图的更改对其进行更新。两者都可以通过引用条目来实现。但是,他们不会意识到从映射中删除,并且将该值设置为null不会释放内存。@Myst:那么,每次需要该值时,您应该再次从映射中查找,而不是保留对可能成为孤立对象的
Map.Entry
对象的引用。如果您的问题是
get()
太慢,那几乎可以肯定是因为您正在使用的关键对象实现了
equals()
hashCode()
。这就是你应该解决的问题。