用Java缓存大量空间数据——可行吗?

用Java缓存大量空间数据——可行吗?,java,caching,out-of-memory,spatial,Java,Caching,Out Of Memory,Spatial,我遇到了这样一种情况,我想在内存中存储一个空间数据缓存,它不是立即需要的,也不是从磁盘加载的,而是通过算法生成的。由于数据是在空间上访问的,因此将根据不相关因素和距离最近读取操作位置的距离从缓存中删除数据。问题是Java的垃圾收集似乎没有很好地与这个系统集成。我希望使用数据的空间知识使其能够被JVM垃圾收集。有没有办法将这些缓存对象标记为可回收垃圾?如果JVM遇到内存不足异常,是否有方法捕获该异常并删除缓存对象以释放内存 还是这是一种错误的做事方式 有没有办法将这些缓存对象标记为可回收垃圾 最简

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

还是这是一种错误的做事方式

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

最简单的方法是储存

  • 一些具有强引用的数据,例如在LinkedHashMap中,可能作为LRU缓存
  • 如果可能,您希望在SoftReferences缓存中保留的数据。这些不会立即清理,但会在OOME之前清理
  • 可以在WeakHashMap中以很少的成本丢弃的数据。在执行GC之前,此数据可用
如果JVM遇到内存不足异常,是否有方法捕获该异常并删除缓存对象以释放内存


您可以这样做,但这并不理想,因为错误可以在任何线程的任何位置抛出。

您不是将引用保留在静态字段中吗?Buth.Guava有一个更强大的缓存类型,而不是<代码> HashMap < /代码>。我只是键入了相同的答案,看一看访问顺序为例,并考虑重写<代码> ReveleDestCeNeType()/代码>删除未经处理的ITESI已经听说GC在内存不足异常发生之前运行。因此WeakHashMap在这里似乎可以工作。感谢您为我指出,以防其他人遇到此问题:WeakHashMap似乎不适合普通的旧缓存,但在我的情况下效果很好,因为重新加载数据的行为从未触及磁盘。使用WeakHashMap的另一种替代方法是使用对HashMap的WeakReference。原因是WeakHashMap的所有键都倾向于一次清除(除非它们保存在别处),这给了JVM大量的weakreference来清理。如果只有一个引用,则HashMap会在清理后重新启动。