在Java中,文件映射是垃圾收集的,并且没有支持的方法来强制销毁映射。
从
FileChannel.map()文档中:
缓冲区及其表示的映射将保持有效,直到缓冲区本身被垃圾回收为止。
映射一旦建立,就不依赖于用于创建它的文件通道。特别是,关闭通道对映射的有效性没有影响。
在Sun的JDK中,可以通过在执行文件移动之前强行破坏映射来测试这确实是罪魁祸首:
import sun.nio.ch.DirectBuffer;import sun.misc.Cleaner;[...]if (byteBuffer.isDirect()) { Cleaner cleaner = ((DirectBuffer) byteBuffer).cleaner(); cleaner.clean();}// move file


