有没有一种在Windows中将文件内容映射到内存的方法,而不会对文件进行锁定(特别是在文件仍然被映射时可以删除文件)?
Java NIO库以这样的方式在Windows中mmap文件,使得只要堆中有任何未被垃圾回收的MappedByteBuffer引用,映射的文件就不能被删除。JDK团队声称这是Windows的限制,但仅适用于文件被映射,而不是作为常规文件打开的情况:
(参考资料,无法在内存映射期间(或尚未垃圾收集)删除文件会在Java中引起许多问题:)
Java NIO库以这样的方式在Windows中mmap文件,使得只要堆中有任何未被垃圾回收的MappedByteBuffer引用,映射的文件就不能被删除。JDK团队声称这是Windows的限制,但仅适用于文件被映射,而不是作为常规文件打开的情况:
https://mail.openjdk.java.net/pipermail/nio-dev/2019-January/005698.html
(显然,如果一个文件在mmap的时候被删除了,在Windows文件语义的世界中对于mmap区域应该发生什么是有争议的,但在Linux中已经定义明确。)(参考资料,无法在内存映射期间(或尚未垃圾收集)删除文件会在Java中引起许多问题:)
http://www.mapdb.org/blog/mmap_files_alloc_and_jvm_crash/
有安全原因导致不支持取消映射操作:
https://bugs.openjdk.java.net/browse/JDK-4724038
更新:另请参阅:如何通过将映射替换为空页面来取消映射mmap'd文件
CreateFile
/CloseHandle
或NtDeleteFile
进行删除关闭映射文件。在这种情况下,文件系统只检查MmFlushImageSection(SectionObjectPointer, MmFlushForWrite)
,而不是MmFlushForDelete
。可能最初是个错误,但现在已经成为标准了。 - Eryk SunSEC_IMAGE
属性,我们可以用这种方式删除文件。 - RbMm