首页 > 解决方案 > 理解弱引用

问题描述

在以下代码中...

public class MyObject {
    public static Map<String, WeakReference<MyObject>> cache = new HashMap<>();
    public static ReferenceQueue<MyObject> queue = new ReferenceQueue<>();
    public MyObject(String... args) {
        //define variables...
        cache.put(args[0], new WeakReference<>(this, queue));
    }
    // getters and setters
}

如果MyObjects 被连续创建,因为cache只包含弱引用,垃圾收集器最终会从 s 中删除项目cache吗?那些物品会变成null? 有没有更好的缓存对象的方法?我的目标是存储不和谐的消息,这样我就不必再次获取它们。

标签: javalisthashmapgarbage-collectionweak-references

解决方案


WeakReferences(一旦被理解)并不神奇,甚至经常容易被误用。一个这样的例子就是你的情况。首先,声明一个显式 ReferenceQueue<MyObject>对你来说是没有用的,这意味着你想“从这里和那里”推送代码以使其工作;这不是一个好策略。

一周参考的想法并不复杂。一旦 GC 循环发现某个实例被弱引用(存在对它的非强引用),它就可以简单地回收该内存并开始nullWeakReference::get. 为了获得您的示例,当某些MyObject实例将被弱引用时,您的:

map.get("whatever").get()

将开始返回null。但Map.Entry仍将存在于HashMap. 没有自动魔法清理。即使是WeakHashMap也不是什么魔法。

有很多“其他”方式来缓存东西,如果没有更多细节,说起来很复杂,这适合你的情况。有guava一个最近使用的缓存LinkedHashMap,例如 等。


推荐阅读