在Java中缓存大量空间数据 - 这是可行的吗?

时间:2012-09-14 09:55:07

标签: java caching out-of-memory spatial

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

或者这是做错事的方法吗?

1 个答案:

答案 0 :(得分:2)

  

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

最简单的方法是存储

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

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

你可以做到这一点,但它并不理想,因为错误可以抛出任何线程中的任何地方。