Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有条件/超时的弱引用_Java_Garbage Collection_Weak References - Fatal编程技术网

Java 具有条件/超时的弱引用

Java 具有条件/超时的弱引用,java,garbage-collection,weak-references,Java,Garbage Collection,Weak References,在Java中,是否可以创建一个弱引用,只有当指定的条件返回true时,该引用的对象才能发送到垃圾收集器 假设我有一个缓存,它将ID号映射到一些数据: Map<Integer, SomeData> cache = new HashMap<>(); 然后,WeakReference检查的唯一内容可能是对对象的强引用,但我希望它是否也检查了我的条件canBeDeleted(),如果它返回false,则没有删除引用。有没有办法做到这一点 (除此之外,还有一个内存泄漏,我不知道如

在Java中,是否可以创建一个弱引用,只有当指定的条件返回
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;
    }
}