我遇到了一种情况,我想存储空间数据的内存缓存,该数据不是立即需要的,也不是从磁盘加载的,而是通过算法生成的。由于数据是在空间上访问的,因此数据会根据不相关因素以及距最近读取操作位置的距离从缓存中删除。问题在于Java的垃圾收集似乎并没有与这个系统很好地集成。我想利用数据的空间知识来使其能够被 JVM 进行垃圾收集。有没有办法将这些缓存对象标记为垃圾可收集?如果JVM遇到内存不足的异常,有没有办法捕获该异常并删除缓存对象以释放内存?
或者这是错误的做事方式吗?
最佳答案
Is there a way to mark these cache objects as garbage-collectible?
最简单的方法就是存储
- 一些具有很强引用值(value)的数据,例如在 LinkedHashMap 中,可能作为 LRU 缓存。
- 如果可能,您希望在软引用缓存中保留的数据。这些不会立即清理,但会在 OOME 之前清理。
- WeakHashMap 中可以以很少的成本丢弃的数据。该数据在执行 GC 之前一直可用。
If the JVM encounters an out-of-memory exception, is there a way to catch that exception and delete the cache objects to free up memory?
您可以执行此操作,但这并不理想,因为错误可能会在任何线程中的任何位置抛出。
关于java - 用Java缓存大量空间数据——可行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12422165/