14


4

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

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

  1. はい、私は知っています:1つはもともとJavaを中心に構築され、もう1つは構築されました アーラン周辺

  2. JVMを(ある程度)理解しており、その構造を比較したい

  3. たとえば、JVMには1つのグローバルGCがあり、BEAMには1つの プロセス

2 Answer


17


まず、Beamはスタックマシンではなく、登録マシンです。 WAM for Prologと同様に、通常のレジスタ(Cの配列として実装)である「Xレジスタ」と、ローカル関数アクティベーションレコード(「呼び出しフレーム」)のスロットの名前である「Yレジスタ」を使用します。スタック上。 スタック操作命令はありません。

第二に、ヒープメモリのさらにいくつかのワードをすばやく割り当てるための命令、ヒープ上のタプルおよびその他のデータ構造の初期化、タプルの要素の選択などのための命令があります。 JVMはオブジェクトに焦点を当てており、メモリ割り当てと基本的な初期化の詳細を隠す「新しい」操作があります。

BEAMには、プロセスの「リダクションカウンター」をデクリメントし、別のプロセスを実行させるタイミングを決定するための命令があります。 一方、JVMにはスレッドの同期命令があります。

1つの重要な違いは、BEAMにはテールコール命令があり、JVMにはないことです。

最後に、BEAMとJVMの両方で、オブジェクトファイルで使用される命令セットは、実際にはトランスポート形式にすぎません。 BEAMエミュレータは、ファイルからの命令を、多くの最適化された特殊なケースの命令(リリースごとに変更できる)を含む内部バージョンに書き換えます。 または、ネイティブコードにコンパイルできます。 ほとんどのJVMは同じことを行います。


1


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

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

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

  3. 1つの重要なポイントは、ガベージコレクションが BEAのプロセスベースは、JVMのグローバルプロセスです。 影響は、JVMのGCがVM全体を数秒間フリーズする一方で、BEAMでは各プロセスが他のプロセスに影響を与えずにその実行操作(削減)をGCに与える必要があることです。

最近、JVM言語用のhttp://www.vertx.io/[VertX](https://akka.io/[Akka]はよくわかりませんが、そうだと思います)のようないくつかの新しいライブラリが実装され始めました問題を解決しようとする同様のプロセス動作1。 2。 ただし、GCの問題はライブラリを使用して簡単に解決することはできません。