从我读过的内容来看,用Java关闭内存映射文件有点棘手。
默认情况下,他们只能通过类似于(但效率更高)终结的机制关闭。
我已经知道可以使用以下代码(受this answer启发,以特定于实现的方式显式关闭它们(但OpenJDK和Oracle JDK共同使用)相关问题):
try {
Method cleanerMethod = buffer.getClass().getMethod("cleaner");
cleanerMethod.setAccessible(true);
Object cleaner = cleanerMethod.invoke(buffer);
Method cleanMethod = cleaner.getClass().getMethod("clean");
cleanMethod.setAccessible(true);
cleanMethod.invoke(cleaner);
} catch(Exception ex) { /* log exception */ }
我从该问题的讨论中收集到,如果没有以这种方式关闭缓冲区,就无法可靠地删除MappedByteBuffer
的支持文件。
但是,还必须关闭其他相关资源:用于创建RandomAccessFile
的{{1}}和FileChannel
。
这些资源的关闭顺序是否重要?在Mac / Windows / Linux上必须关闭它们的顺序之间是否有任何差异?
最终,我想知道如何安全地做到这一点归结为这两个问题:
关闭MappedByteBuffer(和相关资源)并确保保存后备文件的正确方法是什么?
当目标是快速删除支持文件时,是否有办法关闭MappedByteBuffer(和相关资源)而不会意外地导致它将未提交的更改写入磁盘?