gpt4 book ai didi

java - Finalize() 方法忽略映射/列表中的对象?

转载 作者:行者123 更新时间:2023-11-30 03:02:15 24 4
gpt4 key购买 nike

尽管 Object 存在于 List 中,是否仍可能调用 Objectfinalize() 方法 map 。如果不是,如何检测 Object 何时不再可以被任何东西访问,除了仅存在于 List/Map 中.

这背后的原因是我有一个 map ,它的键为 UUID,它是 Object 的唯一 ID,作为 Map 的值。我需要知道 map 的“值”对象何时不再可访问,以便我可以清理空间,因为会有很多对象,但我还需要将它们放在 map 中,直到它们在其他任何地方都不再可访问为止我可以在需要时通过其 UUID 检索它们。

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

最佳答案

首先,如果你有

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

并且 map 仍然被引用,那么值仍然被引用(通过 map )。所以它不会被垃圾收集。

如果您希望值被垃圾收集,您可能需要考虑阅读 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

关于java - Finalize() 方法忽略映射/列表中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35666569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com