【发布时间】:2012-10-19 09:43:35
【问题描述】:
是否可以在 Java 中创建一个弱引用,其对象只有在指定条件返回 true 时才能发送到垃圾收集器?
假设我有一个类似于缓存的东西,它将 ID 号映射到一些数据:
Map<Integer, SomeData> cache = new HashMap<>();
SomeData 有两个重要的方法 - void updateTime(),它只是将一个内部变量设置为当前时间,boolean canBeDeleted(),它检查对象是否在过去 10 分钟内被使用过(只需通过比较当前时间和保存的时间加上 10 分钟)。如果在这段时间内没有使用,则该方法返回true,并且可以从缓存中删除该对象...
但是,当我使用弱引用而不是强引用创建缓存时:
Map<Integer, WeakReference<SomeData>> cache = new HashMap<>();
那么WeakReference 唯一检查的可能是对该对象的强引用,但我希望它也检查我的条件canBeDeleted() 并且如果它返回false 并没有删除引用。有没有办法做到这一点?
(最重要的是,存在内存泄漏,我不知道如何解决它......当 WeakReference 中的对象被删除时,映射仍然包含不必要的键/值对)。
提前致谢。
【问题讨论】:
-
如果您查看
Guavas caches,您可以创建一个自动删除在给定时间内未被引用的条目。 -
对于 "()" 中的问题:你仍然需要清理你的地图。删除 WeakRef 的客户端不会自动删除地图条目。
标签: java garbage-collection weak-references