Java 具有条件/超时的弱引用
在Java中,是否可以创建一个弱引用,只有当指定的条件返回Java 具有条件/超时的弱引用,java,garbage-collection,weak-references,Java,Garbage Collection,Weak References,在Java中,是否可以创建一个弱引用,只有当指定的条件返回true时,该引用的对象才能发送到垃圾收集器 假设我有一个缓存,它将ID号映射到一些数据: Map<Integer, SomeData> cache = new HashMap<>(); 然后,WeakReference检查的唯一内容可能是对对象的强引用,但我希望它是否也检查了我的条件canBeDeleted(),如果它返回false,则没有删除引用。有没有办法做到这一点 (除此之外,还有一个内存泄漏,我不知道如
true
时,该引用的对象才能发送到垃圾收集器
假设我有一个缓存,它将ID号映射到一些数据:
Map<Integer, SomeData> cache = new HashMap<>();
然后,WeakReference
检查的唯一内容可能是对对象的强引用,但我希望它是否也检查了我的条件canBeDeleted()
,如果它返回false
,则没有删除引用。有没有办法做到这一点
(除此之外,还有一个内存泄漏,我不知道如何解决它……当WeakReference中的对象被删除时,映射仍然包含不必要的键/值对)
提前感谢。您可以在条件为真的情况下删除缓存中的密钥。您可以使用它,尽管它不提供根据条目在缓存中的时间量来删除条目的方法,但它确实提供了根据条目是否被访问来删除条目的方法 它为实现者提供了在每次添加新条目时删除最旧条目的机会。如果映射表示缓存,则这非常有用:它允许映射通过删除过时的条目来减少内存消耗
如果您查看,您可以创建一个自动删除给定时间内未被引用的条目的条目。对于“()”中的问题:您仍然必须清理地图。删除WeakRef的客户端不会自动删除映射条目。我知道,但是我需要一个单独的线程,它将每隔10分钟通过缓存,并删除所有不必要的内容。但是,如果可能的话,我更愿意避免另一个线程,并与垃圾收集器进行某种合作。如果您想检查您的条件是否返回
true
,您将需要检查缓存。你想实现什么目标还很不清楚。
Map<Integer, WeakReference<SomeData>> cache = new HashMap<>();
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return size() > limit;
public class Cache<K, V> extends LinkedHashMap<K, V> {
private final int MAX_ENTRIES = 100;
public Cache() {
super(16, 0.75f, true);// accessOrder is true
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > MAX_ENTRIES;
}
}