Java の memory map を理解する
Apache Lucene のインデックスの取り扱いについて勉強していたら、 Java の memory map について言及されていたが、Jave の memory map1 について日本語で分かりやすく解説されている記事がなかったので、勉強がてらまとめた。 メモリマップ自体の説明はこちらのサイトが非常にわかりやすかった2
mmap はファイルとメモリーアドレスのマッピングを行う
つまり、ファイルをメモリ上にマップ(射影)してメモリ上でファイルを扱えるようにするということですね。 Apache Lucene の使用例だと、Lucene の検索用のインデックスファイルを MMap でメモリ上にマップして扱えるようにしていそう。
参考にしたのは上記2つの記事がわかりやすい記事だった。
Java プログラムに関連するメモリは 4 部分から構成される3
- Stack: メソッドが呼ばれた際に、Stack はメソッドを完了させるためのメモリ空間を提供する。この空間はパラメータやローカル変数、現在のオブジェクトへの参照などが格納されている。Frame はメモリ空間を参照し、メソッドの呼び出しをサポートする。Stack は LIFO(Last in First out)方式で動作し、呼び出し基のメソッドの Stack frame を削除するために最後の Stack frame(現在実行中のメソッド) を削除する必要がある。
- Heap: Java で作成されるオブジェクトは全て Heap で作成される。
- Static Area: プログラムの実行中に存在する値を格納するメモリを参照する。静的な変数を宣言した際に、この領域に存在する。
- Code: 実行されるコードが格納される場所。
中でも 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 からサポート(投げ銭)していただけると、著者の活動のモチベーションに繋がります✨
Amazonでほしいものリストも公開しているので、こちらからもサポートしていただけると励みになります。