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 の欠点についても語られておりそれも面白い。