我正在实现一个图像缓存,它可能会占用大量内存,所以我保留了一个 SoftReference 对数据进行成像,以便gc在内存压力下收集数据。然而,每个条目都有一个年龄,那么有没有办法告诉gc(哪一个?)收集旧条目而不是“随机”条目呢?我想我可以通过保留强引用和删除低级别的条目来完成 freeMemory() ,但这是一种“间接释放”(gc仍然必须启动才能真正释放内存)。
SoftReference
freeMemory()
vs3odd8k1#
从文档中:在虚拟机抛出outofmemoryerror之前,保证已清除对软可访问对象的所有软引用。否则,不会对清除软引用的时间或清除对不同对象的一组此类引用的顺序设置任何约束。然而,鼓励虚拟机实现偏向于清除最近创建或使用的软引用。因此,例如,一个复杂的高速缓存可以通过保持对那些条目的强引用来防止其最近使用的条目被丢弃,剩下的条目由垃圾收集器决定是否被丢弃。这来自jdk11java文档。简言之,答案是否定的。我想你可以试着做一些疯狂的事情 finalize 但我建议不要这样做。使用强引用的想法可能是最可行的。
finalize
1条答案
按热度按时间vs3odd8k1#
从文档中:
在虚拟机抛出outofmemoryerror之前,保证已清除对软可访问对象的所有软引用。否则,不会对清除软引用的时间或清除对不同对象的一组此类引用的顺序设置任何约束。然而,鼓励虚拟机实现偏向于清除最近创建或使用的软引用。
因此,例如,一个复杂的高速缓存可以通过保持对那些条目的强引用来防止其最近使用的条目被丢弃,剩下的条目由垃圾收集器决定是否被丢弃。
这来自jdk11java文档。简言之,答案是否定的。我想你可以试着做一些疯狂的事情
finalize
但我建议不要这样做。使用强引用的想法可能是最可行的。