【问题标题】:Prioritize objects for GC为 GC 确定对象的优先级
【发布时间】:2020-11-19 10:55:35
【问题描述】:

我正在实现一个图像缓存,它可能会占用大量内存,因此我将SoftReference 用于图像数据,以便 GC 可以在内存压力下收集它们。

但是,每个条目都有一个年龄,所以有没有办法告诉 GC(哪个?)收集旧条目而不是“随机”条目?

我想我可以通过保持强引用并删除低 freeMemory() 上的条目来自己做到这一点,但这是一种“间接释放”(GC 仍然必须启动才能真正释放内存)。

【问题讨论】:

    标签: java caching memory-management garbage-collection


    【解决方案1】:

    来自文档:

    保证在虚拟机抛出 OutOfMemoryError 之前清除所有对软可访问对象的软引用。否则,对清除软引用的时间或清除对不同对象的一组此类引用的顺序没有任何限制。但是,鼓励虚拟机实现偏向于清除最近创建或最近使用的软引用。

    因此,例如,复杂的缓存可以通过保持对这些条目的强引用来防止其最近使用的条目被丢弃,而剩余的条目则由垃圾收集器自行决定丢弃。

    这是来自 JDK 11 java 文档。简而言之,答案是否定的。我想你可以尝试用finalize 做一些疯狂的事情,但我建议不要这样做。 您使用强引用的想法可能是最可行的。

    【讨论】:

    • 我担心这就是答案。我会在接受之前再等一会儿,以防有人处理类似的问题......
    • @Matthieu Erik 是对的,这会时不时地出现在 SO 上,但最终结果总是一样的。无法强制按某种顺序收集对象。
    • 感谢@Eugene。有时没有解决方案是我们正在寻找的答案......
    猜你喜欢
    • 1970-01-01
    • 2020-05-15
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多