Shunya Ueta

Java の memory map を理解する

Apache Lucene のインデックスの取り扱いについて勉強していたら、 Java の memory map について言及されていたが、Jave の memory map1 について日本語で分かりやすく解説されている記事がなかったので、勉強がてらまとめた。 メモリマップ自体の説明はこちらのサイトが非常にわかりやすかった2

mmap はファイルとメモリーアドレスのマッピングを行う

つまり、ファイルをメモリ上にマップ(射影)してメモリ上でファイルを扱えるようにするということですね。 Apache Lucene の使用例だと、Lucene の検索用のインデックスファイルを MMap でメモリ上にマップして扱えるようにしていそう。

参考にしたのは上記2つの記事がわかりやすい記事だった。

Java プログラムに関連するメモリは 4 部分から構成される3

中でも Java の Memory mapped file は、メモリから直接ファイルにアクセスするのに役立つ Java の特殊ファイル4。 Java は、java.nio パッケージで Memory mapped file をサポートしている。 Memory mapped I/O は、ファイル システムを使用して、ユーザーから直接ファイルシステムページへの仮想メモリマッピング(virtual memory mapping)を確立する。Memory mapped file は単純に大きな配列として扱うことができ、Memory mapped file に使用されるメモリーは、Java の Heap 空間外部が利用される。

indeed のブログ5で JDK が提供する mmap の欠点についても語られておりそれも面白い。

Python メモリマップファイルを試す - Emotion Explorer の記事で

ファイルメモリーマッピングなんて昔からあったけれど、使ったためしがない。 ずっとデータ構造で処理するようにしていたので特に使う機会がなく、ファイルでも SQL データベースばかりだったので、 ビューとか使えばいらないかな。正直、私は今後も使わないかなと思う次第です。

と書かれていたが、たしかに Lucene のようにファイルに対する処理を行いたい場合が最も効果を発揮しそうですね。

---

関連しているかもしれない記事


📮 📧 🐏: 記事への感想のおたよりをおまちしてます。 お気軽にお送りください。 メールアドレス入力があればメールで返信させていただきます。 もちろんお返事を希望せずに単なる感想だけでも大歓迎です。

このサイトの更新情報をRSSで配信しています。 お好きなフィードリーダーで購読してみてください。

このウェブサイトの運営や著者の活動を支援していただける方を募集しています。 もしよろしければ、Buy Me a Coffee からサポート(投げ銭)していただけると、著者の活動のモチベーションに繋がります✨

#java