Finalize()方法忽略地图/列表中的对象?

时间:2016-02-27 06:31:27

标签: java

尽管finalize()Object中存在Object,但仍可以调用List的{​​{1}}方法。如果不是,除了仅在Map / Object中存在外,如何检测List何时不再可访问。

这背后的原因是我的地图的密钥为Map,这是UUID&{39}的唯一ID Object&#39 ; s值。我需要知道"值"地图的对象不再可访问,因此我可以清除空间,因为会有很多对象,但我还需要在地图中将它们放在地图上,直到它们在其他任何地方都无法访问,这样我就可以通过{{1在需要时。

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:2)

好吧,首先,如果你有

Map<K,V> map = new HashMap<>();
map.put(key,value);

并且仍然引用了地图,然后仍然引用了值(通过地图)。所以它不会被垃圾收集。

如果您希望将值收集到垃圾中,您可能需要考虑阅读WeakReference What is the difference between a soft reference and a weak reference in Java?;

这样你可以拥有

Map<K,WeakReference<V>> map = ...
map.put(key, new WeakReference<V>(v));

通过这种方式,您可以使用UUID来获取值,只需map.get(key),但该值也可以进行垃圾回收,您可以通过

检查
if (map.get(key).get()==null){
   //object was garbage collected
}

但是,请注意,如果仍然从另一个引用引用了您的值对象,则不会对其进行垃圾回收。希望对此有所帮助。

如果您的目的是实现一个缓存,确保您不使用太多信息,您可能需要查看Guava的缓存。如果你想要或者和/和对象的到期时间,它有一个内存绑定。 http://www.baeldung.com/guava-cache