- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
map = new HashMap<>(); map.put("Bob", n-6ren">
我遇到过一段代码,我确信它会导致无意中的内存泄漏:
Object user = getUser("Bob");
Map<String, WeakReference<Object>> map = new HashMap<>();
map.put("Bob", new WeakReference( user ) );
这个映射的目的是缓存对象,并在它们不再被强引用时让 GC 自动从映射中清除它们。
但是,我的看法是,如果键也不是弱引用,那么一旦对象被 GC 处理,散列映射中仍然会有一个键指向 null 的条目。因此, map 仍将包含相同数量的行,只是所有行都指向空值。
所以在上面的例子中,一旦所有对 user
的强引用都被释放,并且 GC 销毁了 Object
,映射中的条目将等同于:
map.put("Bob", null );
因此,除非有清理例程用空值刷新所有键,否则我的 map 将继续增长。
那么问题就变成了如何解决这个问题?有没有我可以使用的映射结构,如果值被破坏,它会自动刷新我的条目?
我打算做这样的事情:
Object user = getUser("Bob");
Map<String, WeakReference<Object>> map = new WeakHashMap<>();
map.put(user.getUsername(), new WeakReference( user ) );
但这似乎是一个非常有限的用例,其中我的键必须是从我的值中检索到的对象。对于 WeakHashMap
,我的键不能是字符串常量(即:“Bob”),否则不会有任何其他对它的引用,GC 将从我的映射中清除该对象。
是否有其他一些缓存结构可以提供所有这些功能?
最佳答案
你是对的,引用对象的集合不会删除映射,但是,结果不等同于
map.put("Bob", null );
它将等同于
map.put("Bob", new WeakReference<>(null) );
所以你不仅有一个悬空条目实例,还有一个悬空清除的WeakReference
实例。
当你使用
Map<String, WeakReference<User>> map = new WeakHashMap<>();
User user = getUser("Bob");
map.put(user.getUsername(), new WeakReference( user ) );
假设 user.getUsername()
返回对存储在 User
对象中的字符串实例的引用,您将获得所需的语义,以确保它保持强可达性只要 User
是强可达的。
我没有看到这里有任何限制。由于存储在 User
中的字符串实例确实存在,因此只要 User
实例存在,引用与映射键完全相同的字符串实例就没有开销。您仍然可以使用字符串常量作为查找键 User u = map.get("Bob");
,因为它们的相等性仍然根据 String.hashCode()
和 String.equals()
。如果您使用字符串常量 "Bob"
放置
映射,则至少只要包含常量的 code 还存在,映射通常就会持续存在(以及在此生命周期中使用相同文字的每个其他代码),可能是整个应用程序。但是,使用与存储在引用对象中不同的字符串实例作为键有什么意义呢?
请注意 WeakHashMap
必须处理相同的问题,条目不会自动删除。它必须使用 ReferenceQueue
发现何时收集了引用对象以从表中删除其关联条目。 This cleanup每当您对其调用方法时都会发生,因此当您不对其调用方法时,表将不会得到清理,但由于每次插入都会发生这种清理,因此您可以免受不断增长的情况的影响。
关于java - 如果不明确清理 HashMap<String, WeakReference<>> 是否会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46230629/
我在 linux 上工作。我对windows没有太多想法。 windows中文件的权限是如何组织的?我们在unix中是否有像chmod这样的api来更改权限? 最佳答案 对于 Windows,有一个名
应用程序编程接口(interface) (API) 是一组用于访问基于 Web 的软件应用程序的编程指令和标准。 如果出现 ,有人可以向我解释一下吗?谷歌地图 或 优酷 这是API哪个是softwar
我有两个应用程序,A 和 B,它们使用 android 库 C。B 有一个服务 A 想通过 C 使用,例如 在我的库中有一个类试图将它绑定(bind)到服务,
我正在正常或安全模式下启动相机应用程序,具体取决于使用我的应用程序执行的手势,但一旦用户选择应用程序并点击始终,则没有选项可以更改默认值,即使是从 Android 的设置菜单中也是如此. camera
我有一个数据集,本质上是一个稀疏二进制矩阵,表示两个集合的元素之间的关系。例如,让第一组是人(用他们的名字表示),例如像这样的东西: people = set(['john','jane','mike
何为pythonic? pythonic如果翻译成中文的话就是很python。很+名词结构的用法在中国不少,比如:很娘,很国足,很CCTV等等。 我的理解为,很+名词表达了一种特殊和强调的意味。
某些 Prolog 目标的确定性成功问题已经一次又一次地出现在 - 至少 - 以下问题: Reification of term equality/inequality Intersection an
我指的是 DateTime.TryParse(string s, out DateTime result) 重载,它尝试从字符串中解析 DateTime - 没有特定的格式正在指定。 我可以从http
2020 年 04 月 10 日,《中共中央国务院关于构建更加完善的要素市场化配置体制机制的意见》正式公布,将数据确立为五大生产要素(土地、资本、劳动力以及技术)之
有人可以解释一下 NSNotification 的 addObserver 函数中 notificationSender 的用途吗? 这是 Apple 文档的解释: notificationSende
我是一名优秀的程序员,十分优秀!