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

Java 关闭和/或删除内存映射文件的正确方法是什么?,java,memory-mapped-files,Java,Memory Mapped Files,据我所知,在Java中关闭内存映射文件有点棘手 默认情况下,它们仅通过类似于(但比)终结的机制关闭 我已经知道,通过使用反射,使用以下代码(受一个相关问题的启发),可以以特定于实现的方式(但OpenJDK和Oracle JDK都有一种共同的方式)显式地关闭它们: 我从该问题的讨论中得出结论,如果不以这种方式关闭缓冲区,就不可能可靠地删除MappedByteBuffer的备份文件 但是,还必须关闭其他相关资源:用于创建MappedByteBuffer的RandomAccessFile和FileCh

据我所知,在Java中关闭内存映射文件有点棘手

默认情况下,它们仅通过类似于(但比)终结的机制关闭

我已经知道,通过使用反射,使用以下代码(受一个相关问题的启发),可以以特定于实现的方式(但OpenJDK和Oracle JDK都有一种共同的方式)显式地关闭它们:

我从该问题的讨论中得出结论,如果不以这种方式关闭缓冲区,就不可能可靠地删除
MappedByteBuffer
的备份文件

但是,还必须关闭其他相关资源:用于创建
MappedByteBuffer
RandomAccessFile
FileChannel

这些资源关闭的顺序重要吗?在Mac/Windows/Linux上关闭它们的顺序有什么不同吗

归根结底,我想知道如何安全地完成这两个问题:

关闭MappedByteBuffer(和相关资源)并确保保存备份文件的正确方法是什么

当目标是快速删除备份文件时,有没有一种方法可以关闭MappedByteBuffer(和相关资源),而不会意外地导致它将未提交的更改写入磁盘

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 */ }