java - 当使用 StandardOpenOption.SYNC 打开底层 channel 时,我们是否必须刷新 MappedByteBuffer

标签 java c linux mmap memory-mapped-files

StandardOpenOption.SYNC 是否与 MappedByteBuffers 一起工作并节省我们调用 MappedByteBuffer.force() 的时间?

Set<OpenOption> options = new HashSet<>();
options.add(StandardOpenOption.READ);
options.add(StandardOpenOption.WRITE);
options.add(StandardOpenOption.CREATE);
options.add(StandardOpenOption.SYNC);

FileChannel channel = FileChannel.open("file.tmp", options);
MappedByteBuffer buf = channel.map(FileChannel.MapMode.READ_WRITE, 0,  channel.size());

buf.putInt(500);
buf.force(); // Needed or not?

编辑:

我假设 jdk 使用 O_SYNcflags和 mmap() 调用,所以将这个问题扩展到 linux 世界:当使用 O_SYNcflags打开底层 fd 时,我们必须调用 msync() 吗?

最佳答案

我找不到文档来验证它。

在有和没有 SYNC 选项的 linux/windows 上测试,性能相似,所以我假设文件选项 SYNC/O_SYNC 不适用于 mmap/MappedByteBuffer 操作。

关于java - 当使用 StandardOpenOption.SYNC 打开底层 channel 时,我们是否必须刷新 MappedByteBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48038566/

相关文章:

java - 如何在事件调度线程中同时运行两个组件?

java - 如何将两个不同的对象放入一个 TreeSet 中?

c - 为什么这个 C 程序可以运行? (字符类型相关查询)

linux - GitHub - 如何检查哪个用户用于克隆存储库?

linux - Flyway 连接到 Linux 上的数据库集群

linux - 下载最新二进制文件后出现错误 `make` erlang

java - 只读取大文件的一行以避免内存问题的最佳方法是什么?

java - 为什么这段代码会产生成比例的空白空间?

python - 从 uWSGI 主循环调用 python 代码

c - int *a[3] 和 int (*a)[3] 之间的区别?