(-> % read write unlearn)

My writings on this area are my own delusion

ErlangVM と OracleJVM のメモリ管理の違い

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 があります。
    1. binary heap
    2. 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