java - 我们是否需要使用 MappedByteBuffer.force() 将数据刷新到磁盘?

标签 java performance nio blocking synchronized

我正在使用 MappedByteBuffer 来加速文件读/写操作()。我的问题如下:

  1. 我不确定是否需要使用 .force() 方法将内容刷新到磁盘。似乎没有 .force(),.getInt() 仍然可以完美地工作(好吧,因为这是一个内存映射缓冲区,我假设 .getInt() 从磁盘获取数据,这意味着数据已经被刷新到磁盘已经。

  2. .force() 方法是阻塞方法吗?

  3. 阻塞方法是同步块(synchronized block)吗?

  4. 调用或不调用 .force() 方法在性能上存在巨大差异。手动调用 .force() 有什么好处?我们应该在什么情况下使用它?我假设不调用它,数据仍会在后台写入磁盘。

  5. 如果我们需要调用 .force(),从另一个线程调用它是否有助于提高性能?会不会因为同步问题而破坏数据?

    导入java.io.FileNotFoundException; 导入java.io.IOException; 导入 java.io.RandomAccessFile; 导入 java.nio.MappedByteBuffer; 导入 java.nio.channels.FileChannel; 导入 java.nio.channels.FileChannel.MapMode;

公共(public)课主要{

public static void main(String[] args) throws IOException {
    System.out.println("start");

    RandomAccessFile raf = new RandomAccessFile("test.map", "rw");
    FileChannel fc = raf.getChannel();
    MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, 2000000);

    int total = 0;
    long startTime = System.currentTimeMillis();
    for (int i = 0; i < 2000000; i += 4) {
        mbb.putInt(i, i);
        //mbb.force();
        total += mbb.getInt(i);
    }
    long stopTime = System.currentTimeMillis();

    System.out.println(total);
    System.out.println(stopTime - startTime);
    System.out.println("stop");
}

最佳答案

  1. 只有在您有极端的交易要求时才应调用它,即您正在实现数据库。 getInt() 从内存中读取:操作系统将文件分页进出该内存。

  2. 未指定。

  3. 如果指定,方法是同步的。跟封不封没关系。

  4. 参见 (1)。数据仍将被写入,但由操作系统决定,而不是您的决定。

  5. 我对此表示怀疑,但请参阅 (2),并且我怀疑您根本不需要调用它,请参阅 (1)。

关于java - 我们是否需要使用 MappedByteBuffer.force() 将数据刷新到磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4096881/

相关文章:

c# - 在 Web 应用程序中支持大约 400 多个并发用户的设计考虑

java nio SocketChannel.read 不返回 -1 来指示流结束

java - 如何将 ArrayList<Vector3f> 转换为 ByteBuffer?

java - 使用 MouseListener 在 JPanel 上设置背景颜色

java - Java 中的 PriorityQueue 无法按预期工作。具有较高优先级的对象被插入到队列的末尾

ASP.NET 启动缓慢(符号加载)

javascript - 在 Chrome 18 中检测 SwiftShader WebGL 渲染器

java - PushbackReader 等效项

java - 您可以使用相同的字符串作为多个模型的 key ID 吗?

java - 如何使用 java 写入现有的 XML 文件