Linux 用户空间是否有一种方法可以用空页(从 /dev/null
映射,或也许是一个空页面,重复映射到从文件映射的页面顶部)?
就上下文而言,我想找到此 JDK 错误的修复程序:
https://bugs.openjdk.java.net/browse/JDK-4724038
总结一下这个错误:目前无法在 Java 中取消文件映射,直到 JVM 可以对包装 mmap 文件的 MappedByteBuffer
进行垃圾回收,因为强制取消映射文件可能会导致由于竞争条件而导致的安全问题(例如, native 代码可能仍然尝试访问文件映射到的同一地址范围,并且操作系统可能已经将新文件映射到同一逻辑地址范围)。
我正在寻找替换逻辑地址范围中的映射页面,然后取消映射该文件。有什么办法可以实现这一点吗?
(如果您也知道在其他操作系统(特别是 Windows 和 Mac OS X)中执行此操作的方法,则会加分。)
请注意,这不必是原子操作。主要目标是将内存的取消映射(或用读取时为零的页面替换映射的文件内容)与文件的关闭分开,因为这将解决 Linux(具有每个进程的文件描述符数量的下限)和 Windows(事实上您无法在映射时删除文件)。
更新:另请参阅:Memory-mapping a file in Windows with SHARE attribute (so file is not locked against deletion)
最佳答案
在 Linux 上,您可以将 mmap
与 MAP_FIXED
结合使用,将映射替换为您想要的任何映射。如果替换整个映射,则对文件的引用将被删除。
关于linux - 如何通过替换为空页映射来取消映射 mmap 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54337460/