关闭和/或删除内存映射文件的正确方法是什么?

时间:2016-01-20 00:02:05

标签: java memory-mapped-files

从我读过的内容来看,用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(和相关资源)而不会意外地导致它将未提交的更改写入磁盘?

0 个答案:

没有答案