java - Java中WeakCache的用例是什么?
问题描述
Java中WeakCache的用例有哪些?
解决方案
默认情况下,在 Hashmap 中,当发现对某个值的引用已被清除时,会移除相应的键。此类本质上提供了一个具有强引用键和弱引用值的映射。获取其引用已被清除的值将变为 null。
假设我们要构建一个缓存,将大图像对象作为值,将图像名称作为键。我们想选择一个合适的地图实现来解决这个问题。
使用简单的 HashMap 将不是一个好的选择,因为值对象可能会占用大量内存。更重要的是,它们永远不会被 GC 进程从缓存中回收,即使它们不再在我们的应用程序中使用。
理想情况下,我们需要一个允许垃圾收集器自动删除未使用对象的 Map 实现。当大图像对象的键在任何地方都没有在我们的应用程序中使用时,该条目将从内存中删除。
另一种方式(弱引用键和强引用值)是 WeakHashMap。当垃圾收集 (GC) 进程丢弃一个键时,它的条目会从映射中有效地删除,因此此类的行为与其他 Map 实现有所不同。
另外一点,在我看来,创建自己的缓存实现几乎总是一个坏主意。利用像谷歌缓存这样的库。https://www.tutorialspoint.com/guava/guava_caching_utilities.htm
推荐阅读
- c# - 从框架调用父函数
- reactjs - react-spring:我真的只能通过视口高度(通过`pages`属性)设置高度吗?
- linux - 我想在从文件创建的每个用户名的末尾添加 2 个随机数。我将如何在 bash 中执行此操作?
- icalendar - 编辑的 ics 文件不会自动在电话日历上设置事件
- clojure - 在 Clojure 中,如何保护用户输入的“解析”功能?
- python - 按性别和年份创建总出生数据的数据透视表,然后绘制它们
- pytorch - 如何在 PyTorch 中为 RNN 使用不同的测试批量大小?
- bash - 使用 psql -c "create user...." 后未创建角色
- javascript - 将类添加到位置:粘性但正在向每个粘性元素添加类
- .net - 理解消息“调用的目标已抛出异常”