ErlangVM と OracleJVM のメモリ管理の違い という記事を読んだので、内容を要約しました。 2011年の記事なのでこの情報は古いです。1.7でJVMのメモリ管理も結構変わったし、Erlangのも変わってると思います。けれどconceptualな所は変わってない(変えられない)はず。
private heap
Erlangの memory topology は private heap topology と呼ばれます。Erlangの人達は、Erlangのそれと対比してJavaの memory topology を shared heap topologyと呼びます。
Erlangのヒープは、スレッド毎の領域で、そのライフサイクルはスレッドに追従します。Javaのヒープは、単一の大きな共有領域です。
- private heap はとても小さく、かつ各スレッドに必要なデータは全てここに乗っかります。
- thread の作成時に用意されます。
- private heap とは別に次の2つの shared heap があります。
- binary heap
- message heap
binary heap
任意の大きなデータの塊を処理するのに使用します。例えば、ファイルIOやNWバッファなど。
message heap
スレッド間のメッセージングに必要なデータを配置します。
Eralngのメモリ管理モデルの良いところ
- ヒープがプライベートなので、ロックのチェックが要らない。
- 破壊的なwriteが無いので、共有データに関してもロックのチェックが要らない。
ErlangVM (BEAM) | Oracle JVM | 備考 | |
---|---|---|---|
thread byte | 512byte | 512kb | 約1,000倍の小ささ |
典型的に扱うthread数 | 数千〜数万 | 数百〜数千 | |
メモリ管理形態 | private heap topology | shared heap topology | |
より具体的に | ・tiny local heap (contains all for a thread) |
・huge (shared) heap ・specialized (shared) permanent area |