質問

BEAM と JVM の基本的な機能/アーキテクチャの違いは何ですか?

  1. はい、知っています:1 つは元々 Java を中心に構築され、もう 1 つは erlang を中心に構築されました
  2. JVM を(ある程度)理解しているので、その構造を比較したい
  3. たとえば、JVM には 1 つのグローバル GC があり、BEAM にはプロセスごとに 1 つのグローバル GC があることがわかります。
役に立ちましたか?

解決

まず第一に、ビームは、レジスタマシンではなく、スタックマシンです。 PrologのためのWAMと同様に、(Cの配列として実装)通常のレジスタである「X-レジスタ」、およびローカル機能起動レコード内のスロットの名前である「Y-レジスタ」(「コール・フレーム」)を使用しスタック上。何のスタック操作命令はありません。

第二に、迅速ヒープメモリのいくつかのより多くの単語を割り当てるため、タプルの要素を選択するために、ヒープ上のタプルやその他のデータ構造を初期化するための指示があるなどJVMは、オブジェクトに焦点を当てた、と「新しい」がされますメモリの割り当てと基本的な初期化の詳細を隠すオペレーションます。

BEAMは、プロセスのための「削減カウンタ」をデクリメントし、別のプロセスの実行をできるように生成する時間があるかどうかを決定するための命令を持っています。一方、JVMは、スレッドの同期命令を持っています。

1つの重要な違いは、BEAMは、JVMが欠け末尾呼び出し命令を、持っているということです。

最後に、BEAMとJVMの両方のために、オブジェクト・ファイルで使用される命令セットは本当に唯一のトランスポートフォーマットです。ビームエミュレータは、(別のリリースから変更することができる)は、多くの最適化された特殊なケースの命令と内部バージョンにファイルからの命令を書き換えます。また、あなたはネイティブコードにコンパイルすることができます。ほとんどのJVMは、同じことを行う。

他のヒント

その他の興味深い点は次のとおりです。

  1. プロセスは BEAM 市民であり、VM 自体によって管理されますが、JVM はプロセスの管理を OS に委任します。これにより、BEAM は非常に迅速に管理 (作成、削除、コンテキストの切り替えなど) できるようになり、妥当なマシン上で数百の Java スレッドではなく数十万のプロセスを管理できるようになります。

  2. BEAM では、プロセス間通信はメッセージ交換に基づいており、競合状態を引き起こす可能性のあるすべてではないにしても、ほとんどの状況が排除されます。Java では、スレッドを同期する必要がありますが、これは難しく、バグが発生しやすくなります。

  3. 重要な点の 1 つは、ガベージ コレクションは、JVM ではグローバル プロセスであるのに対し、BEAM ではプロセスごとに実行されるということです。その影響は、JVM 上の GC が VM 全体を数秒間フリーズさせる可能性がある一方で、BEAM 上では各プロセスが他のプロセスに影響を与えることなく、実行操作の一部 (リダクション) を GC に与える必要があることです。

最近、次のような新しいライブラリがいくつかあります。 バートX (本当に分かりません アッカ しかし、私はそれが事実であると信じています) JVM 言語では、問題 1 を解決するために同様のプロセス動作を実装し始めました。と2。ただし、GC の問題はライブラリで簡単には解決できないと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top