0

我遇到了一种情况,我想存储一个空间数据的内存缓存,它不是立即需要的,也不是从磁盘加载的,而是通过算法生成的。由于数据是在空间上访问的,因此将根据无关因素以及与最近读取操作位置的距离从缓存中删除数据。问题是Java 的垃圾收集似乎并没有很好地与这个系统集成。我想使用数据的空间知识使其能够被 JVM 垃圾收集。有没有办法将这些缓存对象标记为垃圾回收?如果 JVM 遇到内存不足异常,有没有办法捕获该异常并删除缓存对象以释放内存?

或者这是错误的做事方式?

4

1 回答 1

2

有没有办法将这些缓存对象标记为垃圾回收?

最简单的方法是存储

  • 一些具有强引用的数据,例如在 LinkedHashMap 中,可能作为 LRU 缓存。
  • 如果可能,您希望在 SoftReferences 缓存中保留的数据。这些不会立即清理,但会在 OOME 之前清理。
  • 在 WeakHashMap 中可以以很少的代价丢弃的数据。在执行 GC 之前,此数据可用。

如果 JVM 遇到内存不足异常,有没有办法捕获该异常并删除缓存对象以释放内存?

你可以这样做,但它并不理想,因为错误可以在几乎任何线程的任何地方抛出。

于 2012-09-14T09:58:47.957 回答