java - 理解弱引用
问题描述
在以下代码中...
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
}
如果MyObject
s 被连续创建,因为cache
只包含弱引用,垃圾收集器最终会从 s 中删除项目cache
吗?那些物品会变成null
? 有没有更好的缓存对象的方法?我的目标是存储不和谐的消息,这样我就不必再次获取它们。
解决方案
WeakReference
s(一旦被理解)并不神奇,甚至经常容易被误用。一个这样的例子就是你的情况。首先,声明一个显式 ReferenceQueue<MyObject>
对你来说是没有用的,这意味着你想“从这里和那里”推送代码以使其工作;这不是一个好策略。
一周参考的想法并不复杂。一旦 GC 循环发现某个实例被弱引用(存在对它的非强引用),它就可以简单地回收该内存并开始null
从WeakReference::get
. 为了获得您的示例,当某些MyObject
实例将被弱引用时,您的:
map.get("whatever").get()
将开始返回null
。但Map.Entry
仍将存在于HashMap
. 没有自动魔法清理。即使是WeakHashMap也不是什么魔法。
有很多“其他”方式来缓存东西,如果没有更多细节,说起来很复杂,这适合你的情况。有guava
一个最近使用的缓存LinkedHashMap
,例如 等。
推荐阅读
- apache-spark - PySpark / Glue:PicklingError:无法序列化对象:TypeError:无法腌制thread.lock对象
- javascript - 而 True 循环阻止页面加载
- python - “Neural_Network”对象没有属性“w1”,但我认为它有
- javascript - JS 中的条件承诺
- c# - 将字节从一个数组复制到另一个数组
- ruby-on-rails - 有没有办法将几个 where 子句与 Ruby on Rails 中的内部 if 语句结合起来?
- javascript - nuxt 通用模式,console.log 输出文件名
- delphi - Windows 防火墙添加带有远程 IP 的路由?
- javascript - 如何使用 Reactjs 或 Javascript 转换 wav 文件中的音频块?
- regex - 捕获组的负后视