2020/04/14

Java 14 の新機能 (5) - JEP 352: Non-Volatile Mapped Byte Buffers

JEP 352: Non-Volatile Mapped Byte Buffers

MappedByteBuffer は java.nio でメモリマップドI/Oを行うときに使う ByteBuffer です。その MappedByteBuffer が不揮発メモリ (Non-Volatile Memory/NVM) 向けに改良されました。
おそらく、Filesystem DAX を使って mmap で NVDIMM に直接アクセスするシチュエーションを考慮したものだと思います。

狙いは何か?

Filesystem DAX で NVDIMM に mmap アクセスする場合、メタデータ更新のタイミングが無いという問題がありました。そのため mmap に MAP_SYNC という新しいフラグが追加されており、これを使ってあげる必要があります。
この MAP_SYNC を FileChannel::map でも指定できるようにしてあげないといけないというのが、この JEP の狙いです。
MAP_SYNC が使えなくても、MappedByteBuffer::force を使えば安全性は確保できますが、効率が悪いので、MAP_SYNC 対応が必要とされています。

使い方

Filesystem DAX で NVDIMM を使用する場合、MapMode を従来のものの代わりに次のように指定します。

  • READ_ONLY の代わりに……
    • jdk.nio.mapmode.ExtendedMapMode.READ_ONLY_SYNC を指定
  • READ_WRITE の代わりに……
    • jdk.nio.mapmode.ExtendedMapMode.READ_WRITE_SYNC を指定
これらを指定すると、内部的に mmap する際に MAP_SYNC フラグが設定されます。